为了账号安全,请及时绑定邮箱和手机立即绑定

请问在HashSet集合中存入同一对象,在哈希值相同情况下为什么没有调用equals方法呢?

请问在HashSet集合中存入同一对象,在哈希值相同情况下为什么没有调用equals方法呢?

拉丁的传说 2019-02-21 19:20:20
Person类中重写了hashCode 跟equals方法,在HashSet集合中添加两次同一对象时在比较得知哈希值相等的时候为什么没有调用equals方法比较就认为元素已经存在了呢? public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } get、set方法省略... @Override public int hashCode() { int hashCode = this.name.hashCode() + this.age * 27; System.out.println(this + "....hashCode" + hashCode); return hashCode; } @Override public boolean equals(Object obj) { Person p = (Person) obj; System.out.println(this + "...equals..." + p); return this.name.equals(p.name) && this.age == p.age; } @Override public String toString() { return this.name + "," + this.age; } 测试类代码: public class HashSetTest { public static void main(String[] args) { HashSet hs = new HashSet(); Person ps = new Person("test", 21); hs.add(ps); hs.add(ps); for (Iterator it = hs.iterator(); it.hasNext(); ) { Person p = (Person) it.next(); System.out.println(p.getName() + "," + p.getAge()); } } } 结果: test,21....hashCode3557065 test,21....hashCode3557065 test,21
查看完整描述

4 回答

?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))
两次操作的是同一个对象,后面的equals方法被短路了

查看完整回答
反对 回复 2019-03-01
?
繁星coding

TA贡献1797条经验 获得超4个赞

首先抛开底层实现来讲,讲道理如果你是两个new的对象,会先比较hashcode,再去比较equals没毛病,但是你这是同一个对象,放了两次,equals和hashcode重写的目的是比较值内容来实现去重,同一个内存地址肯定是同一个对象没有再次比较的必要,再从实现来讲,为什没有调用equals,估计要去看一下hashmap put方法的源码了

查看完整回答
反对 回复 2019-03-01
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

一楼潘金莲说的对

查看完整回答
反对 回复 2019-03-01
?
交互式爱情

TA贡献1712条经验 获得超3个赞

hashcode()判断在堆中是否指向同一个地址,重写的equals()判断逻辑上是否相等。
hashcode相等可以得出equals一点相等,反之不成立。

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 515 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信