Java—HashMap不再是只会用

转自https://blog.csdn.net/woshimaxiao1/article/details/83661464 讲解更透彻

 

看完后自己的理解总结:(会存在错误的说法,望批评指正)

HashMap的主干是一个Entry(Node)<k,v>数组。jdk1.7数组+链表  1.8 数组+链表+红黑树

数组默认大小是16,负载因子是0.75。当当前数组的个数大于数组个数*负载因子的时候,会进行扩容,数组扩容为之前数组的2倍,将旧数组的数据传输到新数组。传输过程 1.7的时候会进行些计算,所以可能会导致原本位置调换,1.8是位置不换。

 

在put的时候先通过key的hashCode()进行hash()计算后indexFor()获取数组下标索引比较,但是hash值会存在哈希冲突,为了解决该冲突,使用了链表。

当找到对应的数组节点时,如果为null就直接插入数据,如果不为null则遍历查询链表,然后用equals对比key,相等则覆盖,不存在则用头插法(1.7)插入链表。然后 因为链表的时间复杂度是O(n),为提升效率当链表(jdk1.8)大于8的时候链表转为红黑树(O(logn))。

 

在get的时候,如果key是NULL就直接查数组第一位置。否则通过key的hashCoe()进行hash()计算再indexFor()获取数组下标索引,为null则返回null,否则判断是否是红黑树,是则调用红黑树的查找,否则遍历链表,通过equals判断是否存在。

 

indexFor() ==>计算出来的 hash 值与 (table.length - 1) 进行 & 运算

 

 

posted @ 2020-03-22 16:28  广医最会上树母猪  阅读(124)  评论(0编辑  收藏  举报