【发布时间】:2012-02-23 04:23:40
【问题描述】:
我在使用 .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;”?
我知道简单地使用 == 来比较两个字符串不起作用的原因,但我很困惑,因为下面的代码在某些情况下似乎确实有效,但并非全部。
任何建议将不胜感激!
问候
【问题讨论】:
-
该代码应该可以工作;
String会覆盖equals()和hashCode()。 -
什么情况下不起作用?记住区分大小写。
-
我怕你误会了。如果您在
HashSet中使用对象,则该对象应该具有良好的hashCode和equals方法,而不是HashSet本身。由于String带有它自己的equals和hashCode方法,因此您不需要做额外的工作。您希望该代码做什么以及为什么“它不起作用”? -
感谢您的快速回复。我说它不起作用,因为“块”HashSet 中的字符串仍被添加到队列中。我已经尝试打印到控制台进行检查,并且肯定会发生。这当然与案件无关。会不会是字符串中包含了打印到控制台时看不到的字符?
标签: java collections hashset