HashMap中的put()和get()的实现原理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HashMap中的put()和get()的实现原理
1、map.put(k,v)实现原理
(1)、⾸先将k,v封装到Node对象当中(节点)。
(2)、然后它的底层会调⽤K的hashCode()⽅法得出hash值。
(3)、通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。
如果说下标对应的位置上有链表。
此时,就会拿着k和链表上每个节点的k进⾏equal。
如果所有的equals⽅法返回都是false,那么这个新的节点将被添加到链表的末尾。
如其中有⼀个equals返回了true,那么这个节点的value将会被覆盖。
2、map.get(k)实现原理
(1)、先调⽤k的hashCode()⽅法得出哈希值,并通过哈希算法转换成数组的下标。
(2)、通过上⼀步哈希算法转换成数组的下标之后,在通过数组下标快速定位到某个位置上。
重点理解如果这个位置上什么都没有,则返回null。
如果这个位置上有单向链表,那么它就会拿着参数K和单向链表上的每⼀个节点的K进⾏equals,如果所有equals⽅法都返回false,则get⽅法返回null。
如果其中⼀个节点的K和参数K进⾏equals返回true,那么此时该节点的value就是我们要找的value了,get⽅法最终返回这个要找的value。
何随机增删、查询效率都很⾼的原因是?
原因: 增删是在链表上完成的,⽽查询只需扫描部分,则效率⾼。
为什么放在hashMap集合key部分的元素需要重写equals⽅法?
因为equals⽅法默认⽐较的是两个对象的内存地址。