HashMap的工作原理以及解决哈希冲突的方法

**1、**HashMap的工作原理? (如何哈希 put)
HashMap基于hashing原理,通过put()和get()方法储存和获取对象。当将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。 HashMap在每个链表节点中储存键值对对象。
当两个不同的键对象的hashcode相同时会发生什么? 它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。
Put:
1) 先检查当前所有键值对中是否存在该键,键相等,值替换。
2) 检查是否是key=null
3) 调用键对象的hashCode()方法来计算hashcode,通过键对象的equals()方法比较
4) 若有效个数/数组长度>=0.75(扩容因子)
5) 需要扩容,2倍扩容
6) 重新哈希,new数组
重新哈希

2、解决哈希冲突的方法
1)线性探测法:
给数组根据余数找对应的下标,放值,若改下标已经有值,继续寻找下一个空位,若数组已满,对数组进行2倍扩容(参考0.75)
2)链地址法:
不带头节点的单链表,采用头插,当一个地址后面链的值太多,如节点>8时,便采用二叉树形式

你可能感兴趣的:(HashMap的工作原理以及解决哈希冲突的方法)