HashSet <string> .contains()</string>

时间:2012-02-23 04:23:40

标签: java collections hashset

我在使用.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;'?

我知道仅仅使用==比较两个字符串不起作用的原因,但我很困惑,因为下面的代码似乎在某些情况下有效,但不是全部。

任何建议都将不胜感激!

此致

1 个答案:

答案 0 :(得分:2)

您不需要覆盖equals方法 - String已经拥有一对非常好的hashCode/equals,它们在CPU周期和分配不同字符串方面都很有效到不同的哈希桶。

放置在哈希集中的项目需要一对hashCode/equals方法才能启用容器的正确工作:hashCode决定放置对象的哈希“bucket” ,equals解析具有相同哈希码的非相等对象之间的冲突。

Wikipedia在哈希表上有一个插图article。通读它以提高您对hashCode/equals概念的理解,它们是在任何语言(包括Java)中使用未排序的关联容器的基础。