以下代码显示如何实现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()
相同的值。