JDK1.7版本HashMap原理解析(数组+链表)
基本的成员变量
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //初始容量,默认16,2^4
static final int MAXIMUM_CAPACITY = 1 << 30; //最大初始量,2^30
static final float DEFAULT_LOAD_FACTOR = 0.75f; //负载因子,默认0.75,越小,hash冲突机率越低
static final Entry<?,?>[] EMPTY_TABLE = {}; //初始化一个Entry空数组
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE; //将初始化好的空数组赋值给table,table数组是HashMap实际存储数据的地方,并不在EMPTY_TABLE数组中
transient int size; //table存储key-value的总数
int threshold; //临界值(HashMap 实际能存储的大小),公式为(threshold = capacit*loadFactor)
final float loadFactor; //负载因子
transient int modCount; //HashMap的结构被修改的次数
static final int ALTERNATIVE_HASHING_THRESHOLD_DEFAULT = Integer.MAX_VALUE;
HashMap初始化:
解析put方法:按照这五步进行解析put方法
1、inflateTable(threshold): 如果table引用指向成员变量EMPTY_TABLE,那么初始化HashMap(设置容量、临界值,新的Entry数组引用)
例子:
Map map = new HashMap(10);
map.put("key","value")
在方法中 roundUpToPowerOf2(9),Integer.highestOneBit((10-1)<<1)
8<<1 -&g