一、HashMap
1、底层实现原理
1.1 JDK7
- 在实例化
HashMap map = new HashMap()
之后,底层会创建一个长度为 16 的Entry[] table
- 调用
map.put(key1,value1)
方法之后- 调用 key1 所在类的的
hashCode()
计算 key1 的哈希值,对此哈希值进行某种算法(与运算)在实例化HashMap map = new HashMap()
之后之后,得到在 Entry 数组中存放的位置索引。- 如果位置上的数据为空,那么此时的
(key1,value1)
添加成功 情况1 - 如果位置上的数据不为空,那么意味着此位置上存在着一个或多个数据(链表的形式),则需要将key1 和已经存在的一个或多个数据进行比较哈希值。
- 如果 key1 的哈希值和参与比较的数据的哈希值都不相同,那么就直接插入成功 情况2
- 如果 key1 的哈希值和已经存在的某个数据
(key2,value2)
哈希值相同,那么就调用 key1 所在类的equals(key2)
- 如果
equals(key2)
为假,那么就直接添加成功。 情况3 - 如果
equals(key2)
为真,那么会使用 value1 来替换 value2
- 如果
- 如果位置上的数据为空,那么此时的
- 调用 key1 所在类的的
注意:对于情况2和情况3,此时的 (key,value)
和原来的数据以链表的方式存储。
在不断添加元素的过程中,会涉及到扩容的问题,默认的扩容方式是为原来容量的两倍(左移1位)