对key求hashcode得到的值来选桶
对key求equals,如果相同则覆盖,不相同则尾插成链表(太长变成红黑树)
取值的时候是插入的逆过程,通过求传入的key的hashcode来选桶,桶里的链表挨个和传入的key求equals,true则取value,false则继续找下一个。
之前一直都是这么理解的,刚刚自己做了个小实验来验证一下,结果正好符合
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
@Override
public int hashCode(){
return 1;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof TreeNode){
TreeNode obj1 = (TreeNode) obj;
if(obj1.val+this.val==10){
return true;
}
else{
return false;
}
}
else{
return (this == obj);
}
}
}
class Solution {
public void test(){
TreeNode treeNode=new TreeNode(1);
TreeNode treeNode1=new TreeNode(9);
HashMap<TreeNode,String> hashMap=new HashMap<>();
hashMap.put(treeNode,"value");
hashMap.put(treeNode1,"value2");
System.out.println(hashMap.size());
}
我自己写了个类,重写了hashcode和equals方法,使得hashcode一直都是相等的(总在一个桶里),当我把treenode1的值设为2的时候,size是2,说明两条都插入了。当我把treenode1设为9的时候,size为1,且值为9,说明覆盖了。