Java中equals方法和hashCode方法的关系

equals()和hashCode()都是Object类中定义的方法,所有类都有这两个方法

Object类中equals方法的代码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

当不对equals()重写时,默认是使用的是“==”进行对对象的地址进行比较,地址相同则返回true,如下

MyObject a = new MyObject(123);

MyObject b = new MyObject(123);
a.equals(b);// a和b的内容是相同的,但是地址不同,所以equals返回值为false

自定义的类实例进行内容比较时,需要重写equals()方法,而String等类已经重写了equals()方法。

hashCode()方法作用是计算对象的哈希值。该方法一般使用场景是把对象保存在需要计算哈希值的类中(如HashMap,Hashtable,HashSet)。

MyObject a = new MyObject(123);

MyObject b = new MyObject(123); 

a.equals(b);// 假设equals被重写为对123进行比较,返回true

Map<MyObject> mp = new hashMap<>();

mp.add(a);

mp.add(b);

System.out.println(a.hashCode(),b.hashCode());// hashCode()方法没被重写,这里a和b的哈希值不同

两个对象equals比较返回true,仍然可以同时存在hashMap中。

为了和equals方法保持一致--euqals返回true时,两个对象的hashcode方法返回值相同;两个对象的hashcode不同时,equals方法返回false。

则需要对hashCode()方法进行重写。如:

@override
public int hashCode(){  
    int hash =  property1.hashCode();
    return property1 ^ property2;
}

 

Java中equals方法和hashCode方法的关系

上一篇:javaSE复习


下一篇:Python string库源码