请查看以下方案,
为什么hashcode,equals方法不生成不同的hashcode,并且在String的情况下等于比较,但在Employee的情况下
Employee.java
public final class Employee { }
Main.java
public static void main(String[] args) {
HashSet hashSet = new HashSet<>();
//For string
String s1 = new String();
String s2 = new String();
System.out.println(hashSet.add(s1)); // true
System.out.println(hashSet.add(s2)); // false
Employee emp1 = new Employee();
Employee emp2 = new Employee();
System.out.println(hashSet.add(emp2)); // true
System.out.println(hashSet.add(emp1)); // true
}
有人请深入解释。
提前致谢!
答案 0 :(得分:1)
从equals
继承的hashCode
和Object
具有身份语义,即只有完全相同的实例才与自身相同。
String
不同,因为它实现了自己的相等版本。
如果你想要另一种相等的定义,你需要为你的班级做同样的事。
答案 1 :(得分:0)
众所周知,Hashset
不允许重复。它使用hashcode()
和equals()
方法执行此重复检查。
如果你没有在你的类中提供这些方法的实现(在你的情况下,Employee
类),将调用Object
类中的默认实现,它使用对象的十六进制地址来表示两个对象是否相等,而不是对象的内容。仔细地覆盖这两种方法会产生预期的结果。