本文介绍了HashSet包含自定义对象的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的自定义类将由HashSet包含
My Custom class that will be contained by HashSet
public class Person {
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"hashcode='" + this.hashCode() + '\'' +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
if (age != person.age) return false;
if (!name.equals(person.name)) return false;
return true;
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age;
return result;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
我的HashSet测试失败
My HashSet test that fails
public void hashSetTest() {
Set<Person> personSet = new HashSet<Person>();
Person p1 = new Person("raghu", 12);
Person p2 = new Person("rimmu", 21);
personSet.add(p1);
personSet.add(p2);
p1.setName("raghus");
p1.setAge(13);
int i2 =p1.hashCode();
System.out.println(personSet.size() + ": "+ p1.hashCode()+" : "+personSet.contains(p1)+ " : "+i2);
}
我希望personSet.contains(p1)通过。为什么它返回假?
谢谢
sri
Iam expecting personSet.contains(p1) to pass. Why is it returning false?Thankssri
推荐答案
因为 p1.hashCode()
修改 p1
时的更改,因此无法再在哈希表中的原始索引处找到它。永远不要让哈希值依赖于一个可变字段。
Because p1.hashCode()
changes when you modify p1
, so it can't be found at its original index in the hash table anymore. Never let a hash value depend on a mutable field.
(你很幸运,它在测试期间失败了;它可能也成功了,但只是失败了生产。)
(You're quite lucky that it fails during testing; it might just as well have succeeded, only to fail in production.)
这篇关于HashSet包含自定义对象的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!