有两个对象:
private class Monkey{
String name;
public Monkey(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
return name.equals(((Monkey) obj).name);
}
}
@Test
public void contain(){
Monkey monkey1 = new Monkey("Jon");
Monkey monkey2 = new Monkey("Jon");
java.util.Set<Monkey> monkeySet = new HashSet<>();
monkeySet.add(monkey1);
System.out.println(monkeySet.contains(monkey2));
// false
monkeySet.add(monkey2);
System.out.println(monkeySet.size());
// 2
}
使用HashSet,它认为Monkey1和Monkey2不是同一对象。但是在我的项目中,如果monkey1.name == monkey2.name
,则它们应该相同。
如何使HashSet认为Monkey1和Monkey2相同?
答案 0 :(得分:2)
您还需要沿hashCode
覆盖equals
,以使这些内容相同。
这是一个示例如何做:
@Override
public int hashCode() {
return Objects.hash(name);
}
请阅读以下优秀读物,以了解为什么需要这样做:why-do-i-need-to-override-the-equals-and-hashcode-methods-in-java
答案 1 :(得分:0)
Hashset在equals方法中使用类的哈希码。当前,您正在使用默认的哈希码,并且equals方法返回false。在Monkey类中使用以下代码,您将获得所需的结果。
private class Monkey{
String name;
public Monkey(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof Monkey))
return false;
Monkey monkey = (Monkey) o;
return name.equals(monkey.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}