我在使用.contains检查字符串是否存储在HashSet中时遇到了问题。
import java.util.HashSet;
public class Controller
{
private Queue<String> queue;
private HashSet<String> blocked;
public Controller()
{
queue = new Queue<String>();
blocked = new HashSet<String>();
}
public void add(String item)
{
if (!(blocked.contains(item))) queue.add(item);
}
}我看了看周围,知道我需要重写.equals方法。这是否意味着我必须创建一个扩展HashSet的新类,然后声明这个新类的一个实例来代替“HashSet blocked;”?
我知道简单地使用==比较两个字符串不起作用的原因,但我感到困惑,因为下面的代码似乎在某些情况下确实有效,但不是所有情况下都有效。
任何建议都将不胜感激!
问候
发布于 2012-02-23 12:27:08
您不需要覆盖equals方法- String已经有一对非常好的hashCode/equals,它们在CPU周期和将不同的字符串分配到不同的散列存储桶方面是有效的。
为了确保容器的正确工作,放置在散列集中的项需要两个hashCode/equals方法:hashCode决定放置对象的散列“桶”,equals解决具有相同散列码的不相等对象之间的冲突。
维基百科上有一个关于哈希表的图解article。通读它可以提高您对hashCode/equals概念的理解,它们是在任何语言中使用未排序关联容器的基础。
https://stackoverflow.com/questions/9407135
复制相似问题