HashMap
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)记录插入顺序。