欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

HashMap?口试? CAD加密 我是谁?我在哪

点击: 次  来源:宝鼎软件 时间:2019-01-10

原文出处: 卓庆森

此刻是晚上11点了,昆山软件开发,学校屠猪馆的自习室因为太晚要封锁了。勤奋且疲劳的小鲁班也从屠猪馆出来了,正筹备回宿舍洗洗睡,由于自习室位置较量荒僻所以是吸收不得手机网络信号的,因此小鲁班从兜里掏脱手机的时候,信息可真是炸了呀。小鲁班心想,微信群平时都没什么人谈天,今晚必定是产生了什么大事。仔细一看,才发明本来是小鲁班的室友达摩(秃顶)拿到了阿里巴巴 Java 开拓实习生的 Offer,此时小鲁班真替他室友感想兴奋的同时,心里也不免会发生一丝丝的失落感,那是因为本身投了许多份简历,别说拿不拿获得 Offer,就连给口试邀的公司也都凤毛麟角。小鲁班这会可真是受到了一万点真实暴击。不外小鲁班照旧很乐观的,很快调解了心态,带上耳机,逐步的走回了宿舍,正规划筹备向他那神室友达摩取取经。

半晌后~

小鲁班:666,传闻你拿到了阿里的 Offer,能透露一下口试内容和能力吗?
达摩:嘿嘿嘿,没问题鸭,啼声爸爸我就汇报你。
小鲁班:耙耙(外貌笑嘻嘻,心里MMP)
达摩:其实我也不是很记得了(请继承装),但我照旧记得那么一些。假如你是面的 Java,首先虽然是JAVA的基本常识:数据布局(Map / List / Set等)、设计模式、算法、线程相关、IO/NIO、序列化等等。其次是高级特征:反射机制,并发与锁,JVM(GC计策,类加载机制,内存模子)等等。
小鲁班:问这么多内容,那岂不是一小我私家都口试好久吗?
达摩:不是的,口试官一般城市用连环炮的方法提问的。
小鲁班:你说的连环炮是什么意思鸭?
达摩:那我举个例子:

  • 就好比问你 HashMap 是不是有序的?你答复不是有序的。
  • 那口试官就会大概继承问你,有没有有序的Map实现类呢?你假如这个时候说不知道的话,那这块问题就到此竣事了。假如你说有 TreeMap 和 LinkedHashMap。
  • 那么口试官接下来就大概会问你,TreeMap 和 LinkedHashMap 是如何担保它的顺序的?假如你答复不上来,那么到此为止。假如你说 TreeMap 是通过实现 SortMap 接口,可以或许把它生存的键值对按照 key 排序,基于红黑树,从而担保 TreeMap 中所有键值对处于有序状态。LinkedHashMap 则是通过插入排序(就是你 put 的时候的顺序是什么,取出来的时候就是什么样子)和会见排序(改变排序把会见过的放到底部)让键值有序。
  • 那么口试官还会继承问你,你以为它们两个哪个的有序实现较量好?假如你依然可以答复的话,那么口试官会继承问你,你以为尚有没有比它更好可能更高效的实现方法?
  • 无穷无尽深入,直到你答复不出来可能口试官认为问题到底了。

    小鲁班捏了一把汗,我去……这是妖怪吧,那我们来试试呗(因为小鲁班方才在自习室才看了这章的常识,想乘隙装一波逼,究竟方才叫了声爸爸~~)

    于是达摩 and 小鲁班就开始了对决:

    1、为什么用HashMap?

  • HashMap 是一个散列桶(数组和链表),它存储的内容是键值对 key-value 映射
  • HashMap 回收了数组和链表的数据布局,能在查询和修改利便担任了数组的线性查找和链表的寻址修改
  • HashMap 长短 synchronized,所以 HashMap 很快
  • HashMap 可以接管 null 键和值,而 Hashtable 则不能(原因就是 equlas() 要领需要工具,因为 HashMap 是后出的 API 颠末处理惩罚才可以)
  • 2、HashMap 的事情道理是什么?

    HashMap 是基于 hashing 的道理

    我们利用 put(key, value) 存储工具到 HashMap 中,利用 get(key) 从 HashMap 中获取工具。当我们给 put() 要领通报键和值时,我们先对键挪用 hashCode() 要领,计较并返回的 hashCode 是用于找到 Map 数组的 bucket 位置来储存 Node 工具。

    这里要害点在于指出,HashMap 是在 bucket 中储存键工具和值工具,作为Map.Node 。

    HashMap?面试? CAD加密 我是谁?我在哪

    以下是 HashMap 初始化

    简化的模仿数据布局:

    Node[] table = new Node[16]; // 散列桶初始化,table
    class Node {
        hash; //hash值
        key; //键
        value; //值
        node next; //用于指向链表的下一层(发生斗嘴,用拉链法)
    }

    以下是详细的 put 进程(JDK1.8)

    1. 对 Key 求 Hash 值,然后再计较下标
    2. 假如没有碰撞,直接放入桶中(碰撞的意思是计较获得的 Hash 值沟通,需要放到同一个 bucket 中)
    3. 假如碰撞了,以链表的方法链接到后头
    4. 假如链表长度高出阀值(TREEIFY THRESHOLD==8),就把链表转成红黑树,链表长度低于6,就把红黑树转回链表
    5. 假如节点已经存在就替换旧值
    6. 假如桶满了(容量16*加载因子0.75),就需要 resize(扩容2倍后重排)

    以下是详细 get 进程

    思量非凡环境:假如两个键的 hashcode 沟通,你如何获取值工具?