我们是否需要TreeMap的hashCode实现?

时间:2014-09-06 16:13:09

标签: java dictionary hashcode treemap comparable

我正在测试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文档。

2 个答案:

答案 0 :(得分:4)

hashCode()被称为默认toString()实现的一部分。由于您尚未实现自己的toString(),我怀疑您在代码中的某处打印了一个导致方法调用的Dog

答案 1 :(得分:0)

我发现这是我的错误我在toString()方法中显式调用了hashCode(),这造成了这种混乱。

尽管如此,结论是,对于TreeMap,它遵循可比较接口实现,并且不遵循hashCode并且等于实现。