java的Object类有方法boolean equals(Object obj),用于判断obj对象与此对象相等。
equals()方法是判断两个对象是否有等价关系(等价关系具有自反性、对称性、传递性):
- 自反性:对于任何非空’引用值‘x,x.equals(x)返回值为true。
- 对称性:对于任何非空非空’引用值‘x和y,有x.equals(y)为真,且y.equals(x)也为真。
- 传递性:对于任何非空非空’引用值‘x、y、z,如果x.equals(y)为真,且y.equals(z)为真,则有 x.equals(z)也为真。
- 一致性:对于任何非空非空’引用值‘x和y,多次调用x.equals(y)结果都一致,要么每次都为真,要么每次都为假。
- null的处理:对于任何非空’引用值‘x,x.equals(x)返回值为false。
通过对比以上的几种性质,才能最大可能保证两个对象是相等的。也就是说:对于任何非空非空’引用值‘x和y,当且仅当x和y指向同一个对象时(即:x==y为真),equals()方法返回值为true。
注意:当对象的equals()方法被重写后,也需要重写hashCode()方法,以保证hashCode()方法的基本性质——相等的对象哈希码相同,即:保证x.equals(y)为真,x和y相等,x和y的哈希码相同。
java的Object类有方法public int hashCode()方法,生成对象的哈希码。
hashCode()方法所需满足的基本性质是:
- 在某java应用的一次执行过程中,多次调用同一个对象的hashCode()方法,得到的是同一个哈希码。但两次执行同一个应用时,调用同一个对象的hashCode()方法,生成的哈希码可能不同。
- 如果两个对象x.equals(y)为true,则x.hashCode()和y.hashCode()生成的哈希码相同。
- 如果两个x.equals(y)为false,则x.hashCode()和y.hashCode()生成的哈希码可能相同,也可能不同(不是必须不同)。但为不同的对象生成不同的哈希码能够提高哈希表的效率。一般情况下,不同对象,生成的哈希码不同。
(From: Java文档)