使用自定义类正确使用Hashtable

Pie*_*ter 3 java collections data-structures

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

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)));
Run Code Online (Sandbox Code Playgroud)

输出是[DBG] false.为什么没有Hashtable注册这个元素?它与我尝试传递Pair给哈希表的方式有关吗?

Boz*_*zho 8

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

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

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

  • (并使用`@Override`来避免试图覆盖`hashcode()`或`equals(Pair)`等.) (5认同)