[英]How override equals and hashcode if some field has collection type?
如何覆盖具有下面描述的字段的类的相等和哈希码?
public class Cartoon {
private String name;
private List<CartoonCharacter> characters;
//other code
public boolean equals(Object o){
// ?
}
public int hashCode(){
// ?
}
}
在 equals 中,您必须定义相等对您的对象的真正含义。 在大多数情况下,您必须在所有字段上执行 equals,对于集合,如果它们匹配,您将需要检查它们的内容。
对于哈希码,您可以基于您拥有的字段的哈希码,您只需要将它们乘以不同的素数,然后对它们执行 XOR(在 Java 中用 ^ 符号表示)。 可以在此处找到有关此的更多信息: Combining Java hashcodes into a "master" hashcode
以下是您的案例的可能方法之一:
public class Cartoon {
private String name;
private List<String> characters;
public boolean equals(Object o){
if(o instanceof Cartoon){
Cartoon cartoonToCompare = (Cartoon) o;
return cartoonToCompare.name.equals(name) &&
cartoonToCompare.characters.containsAll(characters));
}
return false;
}
public int hashCode(){
return 991 * name.hashCode() ^ 997 * characters.size();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.