现在我有这个Java代码
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class Dummy {
private String value;
public Dummy(final String value) {
this.value = value;
}
public boolean equals(final Object that) {
return that instanceof Dummy && Objects.equals(value, ((Dummy) that).value);
}
public int hashcode() {
return Objects.hash(value);
}
public static void main(final String... args) {
final Set<Dummy> dummies = new HashSet<>();
dummies.add(new Dummy("toto"));
System.out.println(dummies.contains(new Dummy("toto")));
}
}
输出是“假”,我应该通过只更改一个字符将其更改为“true”,但我完全不知道如何做到这一点......任何想法?谢谢。 :)
答案 0 :(得分:5)
hashcode()不是Object的方法,但hashCode()是。
public int hashcode() {
return Objects.hash(value);
}
应该是
public int hashCode() {
return Objects.hash(value);
}
答案 1 :(得分:1)
在我的情况下,我有很多对象都需要一个equals和hash方法。我使用lombok来减少工作和代码。
@Data
@AllArgsConstructor
@EqualsAndHashCode
public class JsonPictureStuff {
private String type;
private String url;
private String width;
private String height;
}
注释指示lombok为您添加代码。
答案 2 :(得分:0)
你的集合无效,因为你以不正确的方式实现了equals和hashcode ......
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dummy other = (Dummy ) obj;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
在像eclipse这样的ide中你可以右击并自动生成这些方法,这样你就可以保存实现