为什么重复插入时Hashset输出的变化?让我们说插入重复的字符串对象:false输出,同样的东西为Employee:true

时间:2018-01-07 07:10:22

标签: java collections

请查看以下方案,

  • 创建两个String对象,插入Hashset,输出我得到 false(重复标识为OK)
  • 同样,创建了两个Employee对象emp1,emp2,插入 Hashset,输出我是真的(为什么?)
  

为什么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

    }

有人请深入解释

提前致谢!

2 个答案:

答案 0 :(得分:1)

equals继承的hashCodeObject具有身份语义,即只有完全相同的实例才与自身相同。

String不同,因为它实现了自己的相等版本。

如果你想要另一种相等的定义,你需要为你的班级做同样的事。

答案 1 :(得分:0)

众所周知,Hashset不允许重复。它使用hashcode()equals()方法执行此重复检查。

如果你没有在你的类中提供这些方法的实现(在你的情况下,Employee类),将调用Object类中的默认实现,它使用对象的十六进制地址来表示两个对象是否相等,而不是对象的内容。仔细地覆盖这两种方法会产生预期的结果。