JDK1.7的HashMap源码解读
JDK1.7的HashMap
首先是一些属性
DEFAULT_INITIAL_CAPACITY:初始化容量,代码中为1 << 4 ,即为16。(为什么要这样写呢?)
MAXIMUM_CAPACITY:最大容量,代码中卫1 << 30 ,即为2的30次幂。
30次幂的原因是:改属性为int类型,int类型最大为4个字节,共32个二进制位,理论上可以向左移动31次,即31次幂,但是由于第一位应为标识符号的正负位,所以最大为30次幂。选择int而不选择long和byte是为了性能的折中考虑。
DEFAULT_LOAD_FACTOR:默认加载因子,0.75
EMPTY_TABLE:一个空表(暂时没发现有什么用)
table:相比于EMPTY_TABLE多了transient,不用序列化
size:hashmap的大小
threshold:当hashmap的size大于该值时,就会进行扩容处理。大小为capacity * load factor
loadFactor:装载因子
modCount:用于记录hashmap的修改次数。put和get方法,以及迭代器中都会引入该值。由于HashMap不是线程安全的,所以在迭代的时,会将modCount赋值到迭代器的expectedModCount属性中,后进行迭代,如果在迭代的过程中HashMap被其他线程修改了,modCount的数值就会发生变化,这个时候expectedModCount和ModCount不相等,迭代器就会抛出ConcurrentModificationException()异常。
ALTERNATIVE_HASHING_THRESHOLD_DEFAULT:一个阈值,默认值为Integer.MAX_VALUE,当一个键值对的键是String类型时,且map的容量达到了这个阈值,就启用备用哈希(alternative hashing)。备用哈希可以减少String类型的key计算哈希码(更容易)发生哈希碰撞的发生率。
内部类Holder:已在JDK1.8中删除,为了方便所有依赖都进行加载
hashSeed:初始值为0,哈希种子,用于降低key的hash碰撞概率,如果为0则禁用备用哈希算法
三种构造方法
public HashMap(int initialCapacity, float loadFactor):指定初始容量及加载因子
public HashMap(int initialCapacity):指定初始容量,加载因子默认
public HashMap():加载因子和初始容量都默认
public HashMap(Map<? extends K, ? extends V> m):根据已有的Map接口创建一个元素相同的HashMap
//to-do