[英]Correct use of Hashtable with custom class
这段代码会产生意外的输出。
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
传递给哈希表的方式有关?
您必须覆盖Pair
类的hashCode()
和equals(..)
以指示具有相同数字的两个对象相等。 (最好让IDE为您生成这两种方法。)
Hashtable
使用hashCode()
来确定对象的哈希并查找它。 当您创建一个新的Pair
实例时, Object
的默认哈希实现会生成一个不同的哈希,因此您的Hashtable
无法找到该对(在内部成功)
最后 - 使用HashMap
而不是Hashtable
。 它是一个更新,更好的概念实现,并没有不必要的同步。
它是通过使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.