这个问题可以分成两个方面来回答:
第一:如果你没有重写equals()和hashCode(),那么equals()返回true的话肯定是两个引用指向了同一个对象实例,在内存中指向的地址是一样的,此时hashcode值肯定是相等的。但是此时equals的功能比较单一,只能是跟自身相等,我们通常希望比较的是两个对象的属性,也就需要重写equals方法,此时就会成为第二种情况。
第二:如果你重写了equals(),那么根据Object.hashCode的通用约定,你也必须重写hashCode()。通用约定,hashCode()的返回值和equals()的关系如下:
如果x.equals(y)返回“true”,那么两个对象的hashCode()必须相等。
如果x.equals(y)返回“false”,那么两个对象的hashCode()有可能相等,也有可能不等。
当然,你也可以不遵守这个通用约定,但是这样一来,就有可能导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。
希望能够帮到你理解这个问题。 |