JDK7
HashMap map = new HashMap();
在实例化后,底层创建长度是16的一维数组Entry[] table
…多次执行put();…
map.put( key , value ):
- 首先调用key所在类的hashCode() 计算可以的哈希值,此哈希值经过某种算法计算以后,得到在Entry数据中存放的位置。
- 如果此位置上的数据为空,此时key-value添加成功。
- 如果不为空,意味着此位置上存在一个或多个数据(以链表的形式存在),比较key和已经存在的一个或多个数据的哈希值
- 如果key和已经存在的数据的哈希值都不相同,此时key-value添加成功
- 如果key的哈希值与某一个存在的数据的哈希值相同,继续比较
- 调用key所在类的equals() 进行比较,return false 添加成功, return true 使用value替换旧值
在不断的添加过程中,会涉及到扩容问题,当超出临界值且要存放的位置非空时,默认的扩容方式:扩容为原来容量的 2 倍,并将所有的数据复制过来。
JDK8 和JDK7 的HashMap在底层实现方面的不同:
- new HashMap() : 底层没有创建一个长度为16的数组
- jdk8底层的数组是Node[] 而非Entry[]
- 首次调用put()方法时,底层创建长度为16的数组
- jdk7底层结构:数组 + 链表
jdk8底层结构:数组 + 链表 + 红黑树
5.当数组的某一个索引位置上的元素以链表形式存在的个数 ≥ 8 且当前的数组长度 ≥ 64时,此索引位置上的所有数据改用红黑树存储
默认容量:16
默认加载因子:0.75