zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Socket经验记录
    有了WCF,Socket是否已人老珠黄?
    更新Svn客户端后,右键菜单中没有TortoiseSVN了
    线程已被中止 “Thread was being aborted”
    c# 温故而知新: 线程篇(一)
    SOCKET是多线程安全的吗? [问题点数:40分,结帖人CSDN]
    <base href=""/> 的应用
    Python Twisted 框架中 socket通信
    本人作品-〉VPS应用>Discuz网页斗地主插件
    浅析 c# Queue
  • 原文地址:https://www.cnblogs.com/the-zym/p/13219848.html
Copyright © 2011-2022 走看看