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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

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

6 个回复

倒序浏览
equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
  1. s1 = new String("heima"); //创建字符串对象
  2. s1.equals("heima"); //返回true
复制代码
hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。
1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
2:String类的hashCode.根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串内容相同,返回的哈希码也相同。
3:Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,两个一样大小的Integer对象,返回的哈希码也一样。

如果,我们重写了equals方法,某些时候,“两个对象值相同(x.equals(y) == true),但却可有不同的hash code”是成立的。

评分

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

查看全部评分

回复 使用道具 举报
这个问题可以分成两个方面来回答:
第一:如果你没有重写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

查看全部评分

回复 使用道具 举报
值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象,所以hashcode不同是很正常的。
就看自己怎么重写这它们了。

按照正常的业务逻辑,除非是神经病,要不然重写equals方法和hashCode方法的一定尽量是equals为真,hashCode相等
回复 使用道具 举报
两个对象值相同(x.equals(y) == true),但却可有不同的hash code,对的,
因为两个人可以一样高,但确是两个不同的人,所以住的地址不一样。
还有x.equals(y) 其结果本身就是boolean类型,没必要让他==与一个boolean常量。
回复 使用道具 举报
恩,是的。理解成同一类物品放在不同的车上,物品还是相同的,但是如果跟车结合了,那就不同了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马