覆盖对象等于

Override object equals

我有这个方法:

private static void searchChannelByName(String name, ArrayList<VeediChannel> channel,HashSet<VeediChannel> newChannelsList)
{
    if(channel!=null) {
        for (int i = 0; i < channel.size(); i++) {
            if (channel.get(i).getName().toUpperCase().contains(name))
                newChannelsList.add(channel.get(i));
        }
    }
}

我想覆盖以设置完成设置添加的逻辑(以防止重复)所以在 VeediChannel class 我正在这样做:

@Override
public boolean equals(Object o)
{
    Log.i(Utils.TAG,"In equals");
    if(this.getName().equals(((VeediChannel) o).getName()))
        return true;
    else
        return false;
}

因此,当在 newChannelsList 上调用 add 方法时,应该调用 equals

但是,在检查日志时,根本没有调用 equals 方法 好像是什么问题?

如果你覆盖equals而不覆盖hashCodeHashSetadd方法可能会在错误的桶中寻找添加的元素,如果没有该存储桶中的条目,equals 将永远不会被调用。

即使您覆盖了 equalshashCode,也有可能在向 HashSet 添加元素时不会调用 equals,如果没有重复,每个元素恰好映射到不同的桶。

您的 hashCode 实施必须与 equals 实施兼容。例如:

@Override
public int hashCode ()
{
    return getName().hashCode();
}

您正在添加到 HashSet,除非发生碰撞,否则通常不会使用 equals。对于您正在构建的集合,看起来没有冲突,这意味着默认的哈希算法正在使用它的工作。

但是,除了 equals 之外,您还需要覆盖 hashCode 方法。基本要求是两个相等的对象必须具有相同的哈希值。满足这个条件的简单实现是

@Override
public int hashCode()
{
    Log.i(Utils.TAG,"In hashCode");
    return this.getName().hashCode();
}

如评论中所述,您还必须覆盖 hashCode()。 这是关于这个主题的详细答案: