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方法。