笔记-HashMap底层实现原理

jdk7.0

HashMap map=new HashMap();实例化之后底层会创建一个长度为16的Entry[] table

再往里面加入元素时  map.put(key,value) 

首先,调用key所在类的hashCode()计算key的哈希值,然后通过哈希值计算得到在entry[] 中的位置

如果此位置上为空,添加成功。如果位置上有元素(说明有一个或多个元素),于这些元素比较哈希值

哈希值不一样,添加成功;哈希值一样,然后用key所在类的equals()于哈希值相同的元素对比,返回false,添加成功;返回true,把原来的value替换成现在要加的元素的value.

 //key所在类的equals()需要重写   默认比的是内存地址

关于扩容得问题 ,当超过临界值(且要存放的位置不为空)扩容    原来的2倍并将原有的数据复制过来

8.0

HashMap map=new HashMap();实例化之后没有创建数组

底层数组时Node[] 不是 entry[]

往里面放入元素 map.put(key,value)    底层初始化长度为16的Node[] 

7.0 底层结构为 数组加链表   8.0 底层机构 数组加链表加红黑树

当数组中某一个索引位置上的元素以链表方式存储超过8个以上并且数组长度超过64,此时索引上的所有数据都改成用红黑树存储

 7 链表结构中新的元素指向旧元素   8  链表结构中的旧元素指向新元素

 

DEFAULT_INITIAL_CAPACITY   HashMap默认通量 :16

DEFAULT_LOAD_FACTOR   HashMap的默认加载因子:0.75

threshold    扩容的临界值  =容量*加载因子  16*0.75=12

 

posted @ 2020-06-15 21:54  white-zz  阅读(72)  评论(0)    收藏  举报