如果我想检查某个类MyClass的某个Object是否包含在ArrayList等中,我只能覆盖equals。
public boolean equals(Object o) {
.....
}
但如果我想检查MyClass的对象是否包含在HashMap或HashSet中,我该怎么办? 我想hashCode必须被覆盖?这是正确的吗?我该怎么做? 谢谢! 编辑:我完全了解contains / containsKey等。但是为什么覆盖列表的等于而不是集合就足够了。如果我只测试一个arraylist是否包含一个对象,那么覆盖的方法可以正常工作。对于集合,这还不够。我的问题是如何另外覆盖i.o.要做到这一点。我不想要一个额外的方法,关键在于我猜的hashCode。
答案 0 :(得分:4)
如果在任何情况下覆盖equals,则应始终覆盖hashCode。
http://www.xyzws.com/javafaq/why-always-override-hashcode-if-overriding-equals/20
答案 1 :(得分:3)
完全一样。实际上,有两个部分
在课程中覆盖equals
,因为它有意义
在检索对象的容器中使用该方法。当然,该方法将使用对象的equals
方法。
HashSet有一个contains()
方法,HashMap
一个containsKey
/ containsValue
。
答案 2 :(得分:2)
您可以检查HashSet是否包含具有contains()方法的对象。
您可以使用containsKey()方法检查HashMap是否将对象包含为关键字。
对于其中一种,您可以覆盖Object.equals()
和Object.hashCode()
。通常,如果您覆盖一个,则还必须覆盖另一个,以满足其contracts。
答案 3 :(得分:2)
是的,您必须覆盖MyClass类中的 equals()方法。
以下是一个例子:
public class MyClass {
private String name;
private String gender;
public MyClass(String name, String gender) {
this.name = name;
this.gender = gender;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
MyClass other = (MyClass) obj;
if (gender == null) {
if (other.gender != null) return false;
} else if (!gender.equals(other.gender)) return false;
if (name == null) {
if (other.name != null) return false;
} else if (!name.equals(other.name)) return false;
return true;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((gender == null) ? 0 : gender.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
请注意,当您覆盖等于()方法时,优先覆盖哈希码()是一种很好的编程习惯,特别是在哈希概念出现的情况下到图片中。例如,像 HashMap 一样。
然后您可以按如下方式进行比较:
public class Test {
public static void main(String args[]) throws Exception {
MyClass myFirstClass = new MyClass("John", "Male");
MyClass mySecondClass = new MyClass("Jessica", "Female");
Set<MyClass> mySet = new HashSet<MyClass> ();
mySet.add(myFirstClass);
mySet.add(mySecondClass);
MyClass myDupeClass = new MyClass("Jessica", "Female");
for (MyClass someClass: mySet) {
if (someClass.equals(myDupeClass)) {
System.out.println("Match found for: " + someClass.getName());
}
}
}
}
输出符合预期
Match found for: Jessica