Object类中的hashCode和equals函数有着非常紧密的逻辑关系。当然这个逻辑关系是人赋予它的。在没有覆盖这两函数函数之前,hashCode返回的是地址,equals比较的也是两个应用对象的地址。 也就是说如果两个对象equals,那么hashcode值也应该一样。
对象内容的比较才是设计
equals()
的真正目的,
Java
语言对
equals()
的要求如下,这些要求是必须遵循的。否则,你就不该浪费时间:
对称性:如果
x.equals(y)
返回是
“true”
,那么
y.equals(x)
也应该返回是
“true”
。
反射性:
x.equals(x)
必须返回是
“true”
。
类推性:如果
x.equals(y)
返回是
“true”
,而且
y.equals(z)
返回是
“true”
,那么
z.equals(x)
也应该返回是
“true”
。
还有一致性:如果
x.equals(y)
返回是
“true”
,只要
x
和
y
内容一直不变,不管你重复
x.equals(y)
多少次,返回都是
“true”
。
任何情况下,
x.equals(null)
,永远返回是
“false”
;
x.equals(
和
x
不同类型的对象
)
永远返回是
“false”
。
hashCode()
的返回值和
equals()
的关系如下:
如果
x.equals(y)
返回
“true”
,那么
x
和
y
的
hashCode()
必须相等。
如果
x.equals(y)
返回
“false”
,那么
x
和
y
的
hashCode()
有可能相等,也有可能不等。
在Object类中定义的几个hashCode约定如下:
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数。
我们在改写equals 和 hashCode 函数的时候,一定要遵守如上3条约定,在改写equals的同时也改写hashCode的实现,这样才能保证得到正确的结果。
1. 在同一应用中,一个对象的hashCode函数在equals函数没有更改的情况下,无论调用多少次,它都必须返回同一个整数。
2. 两个对象如果调用equals函数是相等的话,那么调用hashCode函数一定会返回相同的整数。
3. 两个对象如果调用equals函数是不相等的话,那么调用hashCode函数不要求一定返回不同的整数。
我们在改写equals 和 hashCode 函数的时候,一定要遵守如上3条约定,在改写equals的同时也改写hashCode的实现,这样才能保证得到正确的结果。