我有一个类,我想将它设置为HashMap中的键。我已经为该类实现了compareTo方法。但是当我执行以下代码时:
map.put(new MyKey(dummyArguements) , dummyValue ); System.out.println(map.get( new MyKey(dummyArguements) ) );
结果输出为null,这意味着HashMap没有识别出两个键(对于get和put调用)是相同的。
请问有人可以帮我解决这个问题吗?
你应该实现 equals()
和 hashCode()
方法。你的类也应该是不可变的,如果它是可变的,在将其添加到 Map 中后,它的哈希码可能会发生变化。然后,Map 可能无法正确地找到它。
put
和add
之前进行了新的操作。因此,不可变性并不重要。仍然是一个很好的观点,+1。 - fastcodejava1) 通常情况下,对于集合类而言,您需要重写类的equals()方法(以及hashcode()方法)。compareTo()/Comparable和Comparator通常用于排序,并且只在某些情况下替代equals()方法用于对象等价性 - 例如SortedSet的实现者,如TreeSet。
2) 请在您的代码中遵守Java命名规范。您的类名应该大写...例如new MyKey(dummyArguments)
。详见http://www.oracle.com/technetwork/java/codeconventions-135099.html#367(以及http://www.oracle.com/technetwork/java/codeconvtoc-136057.html)。
hashCode()
?排序需要使用compareTo
。HashMap
不会检查 compareTo()
;
HashMap
会检查 hashCode()
和 equals()
。
当使用依赖哈希的集合(如Map和Set)时,您必须实现equals()
和hashCode()
以确保正确的功能。如果您不这样做,新的myKey将始终与存储在映射中的键不同,因为它使用equals()
和hashCode()
的默认实现。
HashMap
的文档,遵循接口和继承……但是没有任何迹象表明上述方法需要被实现或覆盖(因为它们已经从Object
根类中继承)才能使其与HashMap
正常工作。 - user1040049