hashMap面试

hashmap在JDK1.7和JDK1.8做了一个改变
其实这个hashmap底层是基于hash实现的,实现hash有两种方法,一种是数组+链表,一种是数组加二叉树,比如这个数组加链表,将hash的key的hashCode经过扰动函数处理之后的到一个hash值.
    JDK1.7的数组节点是这个entry,使用的是头插法,算出来的值也就是entry存放的位置.当现在有一个(10001,张三)经过扰动函数得到一个地址,比如是1 ,那现在就把这个entry存放到这个位置,但是此时就有一个情况如果又有一个(11001,李四)经过扰动函数得到一个hash值也是1,那这样的话就造成了哈希冲突,,这个时候hashmap会采用了拉链算法,也就是比如张三这个entry放入之后,李四也要放进来,那这样这里entry就有一个next指针,后进来的这个entry就会把之前的entry覆盖掉,然后被覆盖掉的entry的指针指向现在entry,如果还有值要进来,那就现在的entry指针指向第三个进来的值,这样就形成了一个链    表.     
     JDK1.8之后hashmap的数据结构就变成了数组+链表+红黑树,数组节点是一个Node   ,hashmap初始化的时候要是没有设置之,那就是默认长度16,负载因子是0.75,计算这个阈值,当put先去判断,如果size大于阈值就创建一个两倍大小的将原来的entry进行resize.
    JDK1.8对这个put做了优化,当长度大于8的时候就会把链表转为红黑树,  hashmap存储过程:是根据一个key算出hash值,在put时候判断是否存在,如果不存在就调用resize方法创建默认容器的数组,确定Node在数组中的位置,然后判断该位置是否有元素,如果没有就新建一个Node放在该位置,如果有元素判断key是否完全相同,如果相同,把原来的Node赋值给一个变量,此时再去判断是红黑树还是链表,如果是红黑树就以红黑树的方法是将node放在红黑树上,如果是链表此时就遍历链表然后把Node放在最后一位,放完之后判断是否超过8,如果超过就转为红黑树
 

 

 

个人理解 勿喷谢谢  有问题请指教

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页