JAVA-基础知识-HashMap
概述:
HashMap最早出现在JDK1.2中,底层基于散列算法实现。HashMap 允许 null 键和 null 值,是非线程安全类,在多线程环境下可能会存在问题。
采取懒创建的方式 new HashMap();完成后,如果没有put操作,是不会分配存储空间的。
-
HashMap默认初始长度为16,长度必为2的幂
可以通过tableSizeFor(int cap)找到大于或等于 cap 的最小2的整数次幂的数。
index = HashCode(Key) & (Length - 1)
求下标,2的幂次更好的实现Hash算法均匀分布的原则 -
在冲突时从头部插入,过长时转换为红黑树
之所以从头部插入,是因为HashMap的发明者认为,后插入的Entry被查找的可能性更大。 -
线程不安全的原因
- Hashmap在插入元素过多的时候需要进行Resize,Resize的条件是HashMap.Size >= Capacity * LoadFactor。
- Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的情况下可能会形成链表环。