赞
踩
HashMap继承了AbstractMap类,并且通过基于哈希表的 Map接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和null键。
HashMap底层采用哈希表结构(JDK1.8后为数组+链表+红黑树)实现,结合了数组和链表的优点:
// 默认初始化容量为 16 (必须为2的n次幂) static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //最大容量为 2^30 static final int MAXIMUM_CAPACITY = 1 << 30; //默认的加载因子0.75,乘以数组容量得到的值,用来表示元素个数达到多少时,需要扩容。 //为什么设置 0.75 这个值呢,简单来说就是时间和空间的权衡。 //若小于0.75如0.5,则数组长度达到一半大小就需要扩容,空间使用率大大降低, //若大于0.75如0.8,则会增大hash冲突的概率,影响查询效率。 static final float DEFAULT_LOAD_FACTOR = 0.75f; //链表长度过长时,会有一个阈值,超过这个阈值8就会转化为红黑树 static final int TREEIFY_THRESHOLD = 8; //当红黑树上的元素个数,减少到6个时,就退化为链表 static final int UNTREEIFY_THRESHOLD = 6; //链表转化为红黑树,除了有阈值的限制,还有另外一个限制,需要数组容量至少达到64,才会树化。 //这是为了避免,数组扩容和树化阈值之间的冲突。 static final int MIN_TREEIFY_CAPACITY = 64;
//put方法首先调用一个hash方法,计算出k的hash值
//将k的hash值,key,value传进来
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
//这里onlyIfAbsent如果为true,表明不能修改已经存在的值,因此我们传入false
final V putVal(int hash,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。