如果某些字段具有集合类型,如何覆盖等于和哈希码?

How override equals and hashcode if some field has collection type?

如何为 class 覆盖下面描述的字段的相等和哈希码?

public class Cartoon {

    private String name;
    private List<CartoonCharacter> characters;

    //other code

    public boolean equals(Object o){
        // ?
    }

    public int hashCode(){
        // ?
    }

}

在等于中,您必须定义相等对于您的对象的真正含义。在大多数情况下,您必须对所有字段执行 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();
    }

}