HashMap的工作原理
HashMap基于hashing原理,我们可以通过put(key, value)存储对象到HashMap中,可以通过get(key)从HashMap中获取对象。当我们将键值对传递给put()方法时,它先会调用key(键对象)的hashCode()方法来计算其hashCode,然后通过hashCode找到bucket位置的Entry对象(里面储存了key(键对象)和value(值对象)。
碰撞探测和解决方法:
(1)当两个key(键对象)的hashCode相同会发生什么?
他们有equals()和hashCode()方法,所以两个对象就算是hashCode相同,他们也是有可能不相等的。但是hashCode相同,所以他们的bucket位置就是相同的,“碰撞”就会发生。
因为HashMap使用了LinkedList存储对象,所以这个Entry(包含有键值对的Map.Entry对象)会存储在LinkedList中。
(2)当两个key(键对象)的hashCode相同,如何获取值对象?
当调用get(key)方法,HashMap会使用键对象的hashCode找到bucket位置,然后获取value(值对象)。
(两个值对象存储在同一个bucket)--》 遍历所有的LinkedList直到找到值对象。
(没有值对象去比较,如何确定找到值对象?【HashMap在linkedList中存储的是键值对】) --》 找到bucket位置后,会调用keys.equals()方法去找到LinkedList中正确的节点,从而找到值对象。