我尝试检查两个集合,我需要两个结果都为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
答案 0 :(得分:1)
您需要在equals()
类中覆盖hashCode()
和Person
。 HashSet
的实现使用它们来确定两个Person
实例是否相等;如果不重写它们,则将获得默认的Object
实现,其中两个Person
实例只有在它们完全相同的引用时才相等。
答案 1 :(得分:0)
问题不是因为Set
类的比较,而是因为Person
类的比较。
如果根据equals(Object)方法两个对象相等,则 在两个对象中的每个对象上调用hashCode方法必须产生 相同的整数结果。
但是如果两个对象具有相同的
hashcode()
,则没有必要 那么这两个对象也是equals()
。
即使计算出的hashcode()
是相同的,对象也不是equals()
。
这是因为从equals()
类继承的Object
方法也比较了引用。因此是输出。