为什么重写equals时还必须重写hashcode方法
程序员文章站
2024-03-25 22:46:49
...
为什么重写equals时还必须重写hashcode方法
先看一个例子
A
package other.equals;
public class A {
@Override
public boolean equals(Object obj) {
return true;
}
}
B
package other.equals;
public class B {
@Override
public int hashCode() {
return 1;
}
}
C
package other.equals;
public class C {
@Override
public int hashCode() {
return 2;
}
@Override
public boolean equals(Object obj) {
return true;
}
}
测试类
HashSetTest
package other.equals;
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
hashSet.add(new A());
hashSet.add(new A());
hashSet.add(new B());
hashSet.add(new B());
hashSet.add(new C());
hashSet.add(new C());
for (Object hs : hashSet) {
System.out.println(hs);
}
// HashSet重写了toString()方法
// System.out.println(hashSet);
}
}
运行结果
other.equals.B@1
other.equals.B@1
other.equals.C@2
other.equals.A@15db9742
other.equals.A@6d06d69c
其中,只有当equals返回true,且hashcode值相同时,认为两个对象相同
简单理解为以下图
equals返回true,且hashcode值相同时
即:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
推荐阅读
-
为什么重写equals时还必须重写hashcode方法
-
为什么重写equals就必须重写hashCode
-
修改equals方法时为什么还要重写hashcode方法?
-
如果使用Object作为HashMap的Key,为什么要重写hashcode和equals
-
JAVA - 【为什么要重写hashCode和equals?】HashSet
-
HashMap中的key为什么不能为可变对象(除非重写它的hashcode方法和equals方法)
-
HashMap中对象作Key为什么要重写equals和hashcode
-
当集合中的对象要去重时,为什么要重写hashCode和equals方法
-
Java基础---为什么要重写hashCode和equals方法
-
HashSet去重---重写hashcode()方法与equals()方法