在java Hashmap中将自己的类设置为键
我有一个类,我想在HashMap中设置为键。 我已经为该类实现了compareTo方法。 但是当我这样做时:
map.put(new MyKey(dummyArguements),dummyValue); System.out.println(map.get(new MyKey(dummyArguements)));
我得到了。 这意味着hashmap无法识别两个密钥(用于get&put调用)是否相同。
有人可以帮我吗?
您需要实现hashCode()
和equals()
。 对于有序映射/集合,还需要compareTo()
。
有关详细信息,请参阅此问
您应该实现equals()
和hashCode()
。 你的class级也应该是不可改变的。 如果它是可变的,那么在将其添加到map之后,它的哈希码可以改变。 然后地图可能有问题找到它。
1)通常对于集合,您要覆盖的是类的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 )。
HashMap
不检查compareTo()
;
HashMap
检查hashCode()
和equals()
。
当使用依赖于像Map和Set这样的散列的集合时,你必须实现equals()
和hashCode()
以保证正确的function。 如果不这样做,新的myKey将始终与存储在地图中的密钥不同,因为它使用equals()
和hashCode()
的默认实现。
您应该实现equals()和hashCode()。 你的class级也应该是不可改变的。 如果它是可变的,那么在将其添加到map之后,它的哈希码可以改变。 然后地图可能有问题找到它。
你有hashCode()
定义了吗? 需要compareTo
进行排序。
从java8开始,您还应该实现Comparable(添加compareTo),因为如果哈希冲突的数量超过11,HashMap会将条目存储在二叉树中。 如果不这样做,性能会受到影响