以下程式碼顯示如何實現equals()
和hashCode()
方法
class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
/* implement the equals() method */
public boolean equals(Object otherObject) {
// Are the same?
if (this == otherObject) {
return true;
}
// Is otherObject a null reference?
if (otherObject == null) {
return false;
}
// Do they belong to the same class?
if (this.getClass() != otherObject.getClass()) {
return false;
}
// Get the reference of otherObject in a SmartPoint variable
Point otherPoint = (Point) otherObject;
// Do they have the same x and y co-ordinates
boolean isSamePoint = (this.x == otherPoint.x && this.y == otherPoint.y);
return isSamePoint;
}
/*
* implement hashCode() method of the Object class, which is a requirement
* when you implement equals() method
*/
public int hashCode() {
return (this.x + this.y);
}
}
public class Main {
public static void main(String[] args) {
Point pt1 = new Point(10, 10);
Point pt2 = new Point(10, 10);
Point pt3 = new Point(12, 19);
Point pt4 = pt1;
System.out.println("pt1 == pt1: " + (pt1 == pt1));
System.out.println("pt1.equals(pt1): " + pt1.equals(pt1));
System.out.println("pt1 == pt2: " + (pt1 == pt2));
System.out.println("pt1.equals(pt2): " + pt1.equals(pt2));
System.out.println("pt1 == pt3: " + (pt1 == pt3));
System.out.println("pt1.equals(pt3): " + pt1.equals(pt3));
System.out.println("pt1 == pt4: " + (pt1 == pt4));
System.out.println("pt1.equals(pt4): " + pt1.equals(pt4));
}
}
上面的程式碼生成以下結果。
pt1 == pt1: true
pt1.equals(pt1): true
pt1 == pt2: false
pt1.equals(pt2): true
pt1 == pt3: false
pt1.equals(pt3): false
pt1 == pt4: true
pt1.equals(pt4): true
這裡是equals()
方法實現的規範。 假設x
,y
和z
是三個物件的非空參照。
x.equals(x)
應該返回true
。x.equals(y)
返回true
,那麼y.equals(x)
也必須返回true
。x.equals(y)
返回true
,那麼y.equals(z)
也返回true
,則x.equals(z)
必須返回true
。x.equals(y)
返回true
,它應該保持返回true
,直到x
或y
的狀態被修改。 如果x.equals(y)
返回false
,它應該保持返回false
,直到x
或y
的狀態被修改。null
參照的比較:任何類的物件不應等於null
參照。 表示式x.equals(null)
應始終返回false
。hashCode()
方法的關係:如果x.equals(y)
返回true
,x.hashCode()
必須返回與y.hashCode()
相同的值。