覆盖对象等于

时间:2016-03-10 13:55:29

标签: java set hashset

我有这个方法:

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));
        }
    }
}

我想覆盖以设置完成set add的逻辑(用于防止重复),所以在VeediChannel类中我这样做:

@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方法根本不会调用 什么似乎是问题?

3 个答案:

答案 0 :(得分:2)

如果覆盖equals而不覆盖hashCode,则add的{​​{1}}方法可能会在错误的存储桶中查找添加的元素,如果没有条目那个桶,永远不会被叫HashSet

即使您覆盖了equalsequals,但在向hashCode添加元素时,equals可能无法调用{}}},如果没有重复项,并且每个元素恰好映射到不同的存储桶。

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

equals

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

正如评论中所述,您也必须覆盖hashCode()。 以下是关于此主题的详细解答:https://stackoverflow.com/a/27609/3941803