我有这个方法:
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方法根本不会调用 什么似乎是问题?
答案 0 :(得分:2)
如果覆盖equals
而不覆盖hashCode
,则add
的{{1}}方法可能会在错误的存储桶中查找添加的元素,如果没有条目那个桶,永远不会被叫HashSet
。
即使您覆盖了equals
和equals
,但在向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