HashMap

作者: 举个小栗子0317 | 来源:发表于2021-04-26 15:26 被阅读0次

1.JDK1.8之前,HashMap使用数组+链表;

  JDK1.8,当同一个hash值的节点数不小于8时,而且数组的长度不小于64,采用红黑树。

2.默认容量是16,默认负载因子 0.75,容量为2的整数次幂。

JDK1.8之前,第一次put操作时才设定容量。

JDK1.8,构造函数定义HashMap的时候,就会进行容量的设定。

Map map =new HashMap<>(7);    容量为8

添加元素<=6时,容量为8.

3.为什么不一下子把整个链表变为红黑树呢?

(1)构造红黑树要比构造链表复杂,在链表的节点不多的时候,从整体的性能看来,红黑树比一定比链表性能高。

(2)HashMap频繁的扩容,会造成底部红黑树不断的进行拆分和重组,这是非常耗时的。

4.hash().hash值其实就是通过hashCode值hashCode值右移16位 异或计算的来的,使得高位也可以参与hash,因此计算出来hash比较均匀。

5.hash&(length - 1)

(1)hash&(length - 1).等于hash本身,等于对hash取模(hash除比hash还大的数等于hash本身)。

(2)indexFor().保证元素均匀分布。

(3)resize().扩容后长度为原hash表的2倍,length -1 会比之前多一位出来,hash也要往前多拿一位出来与length -1比较,

                       0或1各有一半概率 , 放在新表的高位和地位各有一半概率。

6.哈希冲突。HashMap中处理hash冲突的方法是链地址法。

7.Entry:(hash+key+value+next)

8.ConcurrentHashMap:线程安全的HashMap

9.LinkedHashMap

(1)HashMap的子类。

(2)LinkedHashMap  = HashMap + 双向链表。

(3)记录插入顺序。

相关文章

网友评论

      本文标题:HashMap

      本文链接:https://www.haomeiwen.com/subject/tpvxlltx.html