黑马程序员技术交流社区

标题: 细节的解答 [打印本页]

作者: 赵国刚    时间: 2013-8-11 11:47
标题: 细节的解答
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
作者: 王清华0    时间: 2013-8-11 14:32
这个问题可以分成两个方面来回答:
第一:如果你没有重写equals()和hashCode(),那么equals()返回true的话肯定是两个引用指向了同一个对象实例,在内存中指向的地址是一样的,此时hashcode值肯定是相等的。但是此时equals的功能比较单一,只能是跟自身相等,我们通常希望比较的是两个对象的属性,也就需要重写equals方法,此时就会成为第二种情况。
第二:如果你重写了equals(),那么根据Object.hashCode的通用约定,你也必须重写hashCode()。通用约定,hashCode()的返回值和equals()的关系如下:
如果x.equals(y)返回“true”,那么两个对象的hashCode()必须相等。
如果x.equals(y)返回“false”,那么两个对象的hashCode()有可能相等,也有可能不等。

当然,你也可以不遵守这个通用约定,但是这样一来,就有可能导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。

希望能够帮到你理解这个问题。
作者: 封号了...    时间: 2013-8-12 17:49
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,对的,
因为两个人可以一样高,但确是两个不同的人,所以住的地址不一样。
还有x.equals(y) 其结果本身就是boolean类型,没必要让他==与一个boolean常量。
作者: 云浪    时间: 2013-8-13 13:55
恩,是的。理解成同一类物品放在不同的车上,物品还是相同的,但是如果跟车结合了,那就不同了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2