黑马程序员技术交流社区
标题:
细节的解答
[打印本页]
作者:
赵国刚
时间:
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