在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会将条目存储在二叉树中。 如果不这样做,性能会受到影响