HashMap:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;默认容量
static final int MAXIMUM_CAPACITY = 1 << 30;最大容量
static final float DEFAULT_LOAD_FACTOR = 0.75f;默认负载因子
树化条件:static final int TREEIFY_THRESHOLD = 8;static final int MIN_TREEIFY_CAPACITY = 64;
解树化条件:static final int UNTREEIFY_THRESHOLD = 6;
Node<K,V>[]table:真正存储元素的哈希表;
构造方法:
不带参数的:数组大小为0,在第一次put的时候初始化数组。
带参数的:
若传的初始容量大于最大容量则容量为最大容量,HashMap的最大容量保证是2的n次方,若不满足,用tableSizeFor方法将最大容量转为2的n次方。
tableSizeFor:返回最接近目标值的2次幂;
put方法:
利用hash方法使数据均匀分布;
先判断数组是否为空,若数组为空用resize方法处理一下,利用哈希函数计算出该关键字应放的位置,若有空则直接插入,如果当前的key已存在则替换,若不是则判断该结点是否为树类型,若是则利用尾插插入,同时要判断是否超过负载因子,若超过,要进行扩容,并对结点进行调整,判断该索引处结点是否符合新的结果,若不符合则删去。
HashSet:
第层与HashMap类似,都是哈希桶。