HashMap如何在不调用equals方法的情况下替换键的值

时间:2017-05-11 04:32:42

标签: java hashmap equals

public class Test
{
    public static void main(String[] args) {
        Employee e1=new Employee(1);
        Employee e2=new Employee(1);
        HashMap<Employee,String> map=new HashMap<Employee,String>();
        map.put(e1, "A");
        map.put(e1, "B");
        map.put(e2, "C");
        }
}
class Employee{
    private int id;
     Employee(int id){
         this.id=id;
     }

@Override
public int hashCode() {
    System.out.println("hascode is ="+this.id);
    return  this.id;
}
@Override
    public boolean equals(Object obj) {
    System.out.println("Equals");
        return super.equals(obj);
    }
}

当我再次放置相同的对象e1时,不会调用equals()方法,那么如何在未在地图的现有对象中进行检查的情况下为键e1替换值B? (我想这是等于方法的工作)

1 个答案:

答案 0 :(得分:5)

Object.equals方法的合同要求实施 reflexive

  

reflexive :对于任何非空引用值x,x.equals(x)   应该返回true

这意味着允许HashMap实现,并且事实上,始终首先使用==进行比较,并且如果该比较不是{{1,则仅调用equals方法}}。因此,如果您使用完全相同的对象true替换键e1的值,则它仅使用e1比较,并且永远不会调用==方法。

如果您查看为密钥设置值的equals实现,您会发现此声明的变体两次:

HashMap

(一次用于哈希桶中的第一个密钥,然后在循环中迭代哈希桶中的任何其他密钥)