1.自反性 对于任何非null的引用的值x;x.equals(x);必须返回的是true 2.对称性 对于任何非null的引用值x和y,当且仅当x.equals(y)为true的时候,y.equals(x)也必须返回true 3.传递性 对于任何非null的引用值想x,y,z,当且仅当x.equals(y);为true ;y.equals(z)的时候 x.eqauls(z)也必须为true 4.一致性 对于任何非null的引用值x和y,只要equals的比较操作在对象中的所有的信息都没有被修改,多次调用x.equals(y)就会一致的返回true;或者一致的返回false; 5,

最终要的一点是在重写equals的时候必须要重写hashcode 如果两个对象根据equals方法比较是相等的,那么调用这两个对象中任意一个对象的hashcode方法都必须产生同样的整数结果。如果调用eqauls方法去比较两个对象,如果两个对象是不相等的,则不一定产生不同的hashcode.

就有如下的例子

public final class PhoneNumber{ private final short areaCode;

private final short prefix;

private final short lineNumber;

public PhoneNumber(int areaCode,int prefix,int lineNumber){

this.areaCode=areaCode; this.prefix=prefix; this.lineNumber=lineNumber;

}

}

实例化 PhoneNumber t1=new PhoneNumber(2,3,4); PhoneNumber t2=new PhoneNumber(2,3,4); 将ti作为key存储如下: map.put(t1,"jack"); 再用t2去取数据的时候,我们期望得到的数据为jack,但是实际我们得到的是null;这是为什么呢? 因为PhoneNumber 没有重写hashCode 方法,就两个相同的对象产生了不同的hashcode,而在get的时候我们根据t2所在散列桶中去找之前的数据,当然是找不到的,put的数据在t1,所在的散列桶中,所以用t2去找的时候当然为null; 因此在重写equals的时候必须重写hashcode方法。