如何解决如果某些字段具有集合类型,如何覆盖 equals 和 hashcode?
如何覆盖下面描述的字段的类的相等和哈希码?
public class Cartoon {
private String name;
private List<CartoonCharacter> characters;
//other code
public boolean equals(Object o){
// ?
}
public int hashCode(){
// ?
}
}
解决方法
在 equals 中,您必须定义相等对于您的对象的真正含义。在大多数情况下,您必须对所有字段执行 equals,对于集合,您需要检查它们的内容是否匹配。
对于哈希码,您可以基于您拥有的字段的哈希码,您只需要将它们乘以不同的素数,然后对它们执行异或(在 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();
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。