HashMap类成员变量释义,代码如下:
static final int DEFAULT_INITIAL_CAPACITY = 16;//默认初始容量大小16
static final int MAXIMUM_CAPACITY = 1073741824;//hashmap最大容量是2的30次方
static final float DEFAULT_LOAD_FACTOR = 0.75F;//默认加载因子
static final int TREEIFY_THRESHOLD = 8;//当同一个槽位的链表的长度大于8时,转成红黑树,查询效率更高
static final int UNTREEIFY_THRESHOLD = 6;//树大小为6,就转回链表
static final int MIN_TREEIFY_CAPACITY = 64;//数容量最小64
transient Node<K, V>[] table;//哈希桶数组,真正存放键值对的数据结构
transient Set<Map.Entry<K, V>> entrySet;
transient int size;//表示保存的键值对数量
transient int modCount;//HashMap被改变的次数,扩容的次数
int threshold;//阈值,当size大小大于这个数进行扩容,threshold = 容量*加载因子
final float loadFactor;//加载因子实际大小
put方法,代码如下:
public V put(K paramK, V paramV) {//onlyIfAbsent表示是否替换原值
//参数evict我们可以忽略它,它主要用来区别通过put添加还是创建时初始化数据的
return (V) putVal(hash(paramK), paramK, paramV, false, true);
}
final V putVal(int paramInt, K paramK, V paramV, boolean paramBoolean1, boolean paramBoolean2) {
Node[] arrayOfNode;
int i;
//如果表table不存在或者空表,进行初始化一个表出来,
if (((arrayOfNode = table) == null) || ((i = arrayOfNode.length) == 0)) {
//resize()不仅用来调整大小,还用来进行初始化配置
i = (arrayOfNode = resize()).length;
}
int j;
Object localObject1;
//判断在(j = i - 1 & paramInt)位置是否有元素,没有则进行直接创建node节点进行保存键值对
if ((localObject1 = arrayOfNode[(j = i - 1 & paramInt)]) == null) {
arrayOfNode[j] = newNode(paramInt, paramK, paramV, null);
} else {//如果在(j = i - 1 & paramInt)位置有值
Object localObject3;
Object localObject2;//把带插入的元素赋值localObject2,用来查看是不是待插入的元素已经有了,有就替换
//当前元素hash值和参数paramInt相等,并且当前元素key值和参数paramK相等,表示要插入的元素就是当前元素,说明要插入的已经存在,则进行当前元素值替换,即修改当前元素value值
if ((hash == paramInt)
&& (((localObject3 = key) == paramK) || ((paramK != null) && (paramK.equals(localObject3))))) {
localObject2 = localObject1;//要插入的元素就是localObject1,localObject1已经存在,把它赋值给localObject2,方