hashmap原理
hashmap是否初始化
1.hashmap默认bucket数组多大: 16
2.new hashmap<19>的时候bucket数组多大: 32 ,最接近19的2的幂次方
3.hashmap什么时候开辟bucket数组占用内存 :put的时候
4.hashmap时扩容 :put的元素达到容量成积负载因子默认是 16*0.75
JDK7 中的 HashMap 还是采用大家所熟悉的数组+链表的结构来存储数据。
JDK8 中的 HashMap 采用了数组+链表或树的结构来存储数据。
win merge
- HashMap 在 new 后并不会立即分配bucket数组,而是第一次 put 时初始化,类似 ArrayList 在第一次 add 时分配空间。
- HashMap 的 bucket 数组大小一定是2的幂,如果 new 的时候指定了容量且不是2的幂,实际容量会是最接近(大于)指定容量的2的幂,比如 new HashMap<>(19),比19大且最接近的2的幂是32,实际容量就是32。
- HashMap 在 put 的元素数量大于 Capacity * LoadFactor(默认16 * 0.75) 之后会进行扩容。
- JDK8在哈希碰撞的链表长度达到TREEIFY_THRESHOLD(默认8)后,会把该链表转变成树结构,提高了性能。
- JDK8在 resize 的时候,通过巧妙的设计,减少了 rehash 的性能消耗