我正在测试TreeMap
的行为并理解排序过程。但是我仍然处于一种令人困惑的想法,对于检索,自定义键类需要覆盖hashCode方法。话虽如此,我已经搜索了足够的谷歌,但找不到任何合理的答案。
以下是我合作的例子。
class Dog implements Comparable<Dog> {
String color;
int size;
Dog(String c, int s) {
color = c;
size = s;
}
int hc;
@Override
public int hashCode() {
hc = super.hashCode();
return hc;
}
@Override
public int compareTo(Dog o) {
return this.color.compareTo(o.color);
}
}
用于测试TreeMap的测试代码..
public class TestHashMap {
public static void main(String[] args) {
Dog d1 = new Dog("a", 1);
Dog d2 = new Dog("b", 2);
Dog d3 = new Dog("c", 3);
Dog d4 = new Dog("d", 4);
Dog d5 = new Dog("e", 5);
Dog d = new Dog("c", 3);
TreeMap<Dog, Integer> hm = new TreeMap<>();
hm.put(d1, 10);
hm.put(d2, 15);
hm.put(d3, 5);
hm.put(d4, 20);
hm.put(d5, 25);
System.out.println("value is :" + hm.get(d));
}
}
无论我是否实现hashCode方法,都可以正确检索值,但是在调试时,总是调用hashcode方法,所以如果真的hashCode实现是必需的,我会感到困惑。
有人可以帮助理解从TreeMap中检索的正确行为。
请不要从TreeMap复制粘贴java文档。
答案 0 :(得分:4)
hashCode()
被称为默认toString()
实现的一部分。由于您尚未实现自己的toString()
,我怀疑您在代码中的某处打印了一个导致方法调用的Dog
。
答案 1 :(得分:0)
我发现这是我的错误我在toString()方法中显式调用了hashCode(),这造成了这种混乱。
尽管如此,结论是,对于TreeMap,它遵循可比较接口实现,并且不遵循hashCode并且等于实现。