首页 > 技术文章 > JDK1.7的HashMap源码解读

the-zym 2020-07-01 16:17 原文

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

推荐阅读