1.参考
(1)Java HashMap工作原理及实现
https://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/
https://cloud.tencent.com/developer/article/1167574
(2)如果两个对象不相同,他们的hashcode可能相同?
https://myhadoop.iteye.com/blog/2059833
2.摘抄笔记
注意:
(1)什么时候会使用hashmap?他有什么特点?
是基于Map接口的实现,存储键值对时,他可以接收null的键和值,是非同步的,hashmap存储着Entry(hash,key,value,next)对象。
(2)你知道hashmap的工作原理吗?
(a)使用hash的方式,通过put和get存储和获取对象。
(b)存储对象时,我们将键值对传递给put方法是,它调用hashCode
计算hash值,然后进一步得到存储的位置进行存储
(c)获取对象时,调用key的hashCode方法,计算hash从而得到位置,
进一步调用key的equals方法确定键值对。如果发生碰撞,会用链表将其组织。
(3)如果hashmap的大小超过了负载因子定义的容量,怎么办?
如果超过负载因子(默认0.75即3/4),会重新resize一个原来长度两倍的hashmap,并重新调用hash方法进行组织。
3. put函数的实现
put函数大致的思路为:
对key的hashCode()做hash,然后再计算index;(key是唯一的hashcode可能存在两个对象相同)
如果没碰撞直接放到bucket里;
如果碰撞了,以链表的形式存在buckets后;
如果碰撞导致链表过长(大于等于TREEIFY_THRESHOLD),就把链表转换成红黑树;
如果节点已经存在就替换old value(保证key的唯一性)
如果bucket满了(超过load factor*current capacity),就要resize。