这段代码会产生意外的输出。
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
传递给哈希表的方式有关?
答案 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));