覆盖对象等于
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
而不覆盖hashCode
,HashSet
的add
方法可能会在错误的桶中寻找添加的元素,如果没有该存储桶中的条目,equals
将永远不会被调用。
即使您覆盖了 equals
和 hashCode
,也有可能在向 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()
。
这是关于这个主题的详细答案:
我有这个方法:
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
而不覆盖hashCode
,HashSet
的add
方法可能会在错误的桶中寻找添加的元素,如果没有该存储桶中的条目,equals
将永远不会被调用。
即使您覆盖了 equals
和 hashCode
,也有可能在向 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()
。
这是关于这个主题的详细答案: