首页 > 学院 > 开发设计 > 正文

HashMap源码解析

2019-11-08 00:52:00
字体:
来源:转载
供稿:网友

属性

DEFAULT_INITIAL_CAPACITY ==16 //初始容量(必须为2的次方)MAXIMUM_CAPACITY = 1 << 30 //最大容量为2的30次方DEFAULT_LOAD_FACTOR =0.75f //默认加载因子(用于resize:hashmap中的元素达到3/4总容量时进行扩充)Entry[] table;// Entry数组(数组容量必须是2的多少次方,若有必要会扩容resize)–这就是HashMap的底层数据结构transient int size; // 该map中存放的key-value对个数,该个数决定了数组的扩容(而非table中的所占用的桶的个数来决定是否扩容) 扩容resize的条件: capacity=16,load_factor=0.75,threshold=capacity*load_factor=12,即当该map中存放的key-value对个数size>=12时,就resizefinal float loadFactor; // 负载因子(用于resize)transient volatile int modCount;// 标志位,用于标识并发问题

注意

hashmap的底层结构是数组加链表,解决冲突采用的是链地址法。table[] 表示桶,每个桶里面对应一个链表。

构造方法

无参数构造方法:初始化一个负载因子(0.75)、resize条件(16*0.75)和Entry数组(16)this.loadFactor = DEFAULT_LOAD_FACTOR;// 负载因子:0.75threshold = (int) (DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);//当该map中存放的key-value对个数size>=12时,就resizetable = new Entry[DEFAULT_INITIAL_CAPACITY];// 设置Entry数组容量为16带参数构造方法 双参数:HashMap(int initialCapacity, float loadFactor) initialCapacity为初始化容量,构造方法会找一个2的几次方的数,该数刚刚大于initialCapacity(如果initialCapacity=17,则容量为32即2的5次方)单参数:HashMap(int initialCapacity) 直接调用双参数方法,loadFactor为默认加载因子

注意

利用上述两个构造器构造出的数组容量不一定是指定的初始化容量,而是一个刚刚大于指定初始化容量的2的几次方的一个值。在实际使用中,若我们能预判所要存储的元素的多少,最好使用上述的单参构造器来指定初始容量,这样的话,就可以避免就来扩容时带来的消耗(这一点与ArrayList一样)
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表