我在使用.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;'?
我知道仅仅使用==比较两个字符串不起作用的原因,但我很困惑,因为下面的代码似乎在某些情况下有效,但不是全部。
任何建议都将不胜感激!
此致
答案 0 :(得分:2)
您不需要覆盖equals
方法 - String
已经拥有一对非常好的hashCode/equals
,它们在CPU周期和分配不同字符串方面都很有效到不同的哈希桶。
放置在哈希集中的项目需要一对hashCode/equals
方法才能启用容器的正确工作:hashCode
决定放置对象的哈希“bucket” ,equals
解析具有相同哈希码的非相等对象之间的冲突。
Wikipedia在哈希表上有一个插图article。通读它以提高您对hashCode/equals
概念的理解,它们是在任何语言(包括Java)中使用未排序的关联容器的基础。