两个Set包含相同的元素,但不相等。为什么会这样呢?

时间:2018-07-17 15:01:13

标签: java collections hashset

我尝试检查两个集合,我需要两个结果都为TRUE,但事实并非如此。 我不知道为什么结果之一是返回false。 请帮助我,非常感谢。

类CollectionExample:

    Set<String> set1 = new HashSet<>();
    set1.add(new String("A"));
    set1.add(new String("B"));
    Set<String> set2 = new HashSet<>();
    set2.add("A");
    set2.add("B");

    System.out.println("set1.equal(set2): "+ set1.equals(set2));

    Set<Person1> set3 = new HashSet<>();
    set3.add(new Person1("A", "1"));
    set3.add(new Person1("B", "1"));
    Set<Person1> set4 = new HashSet<>();
    set4.add(new Person1("A", "1"));
    set4.add(new Person1("B", "1"));

    System.out.println("set3.equal(set4): "+ set3.equals(set4));

实体Person1:

public class Person1 {

String firstName;
String lastName;

public Person1(String firstName, String lastName) {
    // TODO Auto-generated constructor stub
    this.firstName = firstName;
    this.lastName = lastName;
}

public String firstName() { return firstName;}
public String lastName() { return lastName;}
}

结果:

set1.equal(set2): true
set3.equal(set4): false

2 个答案:

答案 0 :(得分:1)

您需要在equals()类中覆盖hashCode()PersonHashSet的实现使用它们来确定两个Person实例是否相等;如果不重写它们,则将获得默认的Object实现,其中两个Person实例只有在它们完全相同的引用时才相等。

答案 1 :(得分:0)

问题不是因为Set类的比较,而是因为Person类的比较。

  

如果根据equals(Object)方法两个对象相等,则   在两个对象中的每个对象上调用hashCode方法必须产生   相同的整数结果。

     

但是如果两个对象具有相同的hashcode(),则没有必要   那么这两个对象也是equals()

即使计算出的hashcode()是相同的,对象也不是equals()
这是因为从equals()类继承的Object方法也比较了引用。因此是输出。