A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 赵国刚 中级黑马   /  2013-8-11 11:47  /  1249 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?

6 个回复

倒序浏览
这个问题可以分成两个方面来回答:
第一:如果你没有重写equals()和hashCode(),那么equals()返回true的话肯定是两个引用指向了同一个对象实例,在内存中指向的地址是一样的,此时hashcode值肯定是相等的。但是此时equals的功能比较单一,只能是跟自身相等,我们通常希望比较的是两个对象的属性,也就需要重写equals方法,此时就会成为第二种情况。
第二:如果你重写了equals(),那么根据Object.hashCode的通用约定,你也必须重写hashCode()。通用约定,hashCode()的返回值和equals()的关系如下:
如果x.equals(y)返回“true”,那么两个对象的hashCode()必须相等。
如果x.equals(y)返回“false”,那么两个对象的hashCode()有可能相等,也有可能不等。

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

希望能够帮到你理解这个问题。

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,对的,
因为两个人可以一样高,但确是两个不同的人,所以住的地址不一样。
还有x.equals(y) 其结果本身就是boolean类型,没必要让他==与一个boolean常量。
回复 使用道具 举报
恩,是的。理解成同一类物品放在不同的车上,物品还是相同的,但是如果跟车结合了,那就不同了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马