使用自定义类正确使用Hashtable

时间:2010-10-31 21:25:12

标签: java data-structures collections

这段代码会产生意外的输出。

Hashtable<Pair, Integer> results = new Hashtable<Pair, Integer>();
results.put(new Pair(0, 1), 2);
System.out.println("[DBG] " + results.containsKey(new Pair(0, 1)));

输出为[DBG] false。为什么Hashtable无法注册此元素?是否与我尝试将Pair传递给哈希表的方式有关?

2 个答案:

答案 0 :(得分:8)

您必须覆盖hashCode()类的equals(..)Pair,以指示具有相同数字的两个对象相等。 (最好让IDE为您生成这两种方法。)

Hashtable使用hashCode()来确定对象的哈希并查找它。当您创建新的Pair实例时,Object的默认哈希实现会生成不同的哈希,因此您的Hashtable无法找到该对(在内部成功)

最后 - 使用HashMap代替Hashtable。这是一个更新,更好的概念实现,并没有不必要的同步。

答案 1 :(得分:2)

它是由使用new Pair(0,1)创建两个不同的对象引起的。所以你有两个选择来实现:

第一个是你应该实现hashCode并且等于Pair类的方法。

第二个使用相同的对象:

Hashtable<Pair, Integer> results = new Hashtable<Pair, Integer>();
Pair key=new Pair(0, 1)
results.put(key, 2);
System.out.println("[DBG] " + results.containsKey(key));