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

最佳答案

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

08-06 01:59
查看更多