繁体   English   中英

TreeMap java 实现 - 放置第一个元素

[英]TreeMap java implementation - putting 1st element

public V put(K key, V value) {
    Entry<K,V> t = root;
    if (t == null) {
        compare(key, key); // type (and possibly null) check
        root = new Entry<>(key, value, null);
        size = 1;
        modCount++;
        return null;
    }
    int cmp;
    ...
}

final int compare(Object k1, Object k2) {
    return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
}

在我的应用程序中遇到一些错误后,我不得不调试 TreeMaps put 方法。 我的问题是比较放置在地图中的对象。 奇怪的是,当我将FIRST元素放入 Map 时,它的键会与自身进行比较。 我不明白为什么会这样。 任何见解(除了评论的“类型(可能为空)检查”)? 他们为什么不检查 key 是否为空? 那里进行了什么样的“类型”检查,用于什么?

如评论中所述, https://bugs.openjdk.java.net/browse/JDK-5045147是引入此问题的问题。 根据该问题的讨论,原始修复如下:

BT2:建议修复

道格·利写道:

“谢谢!我有一种强烈的似曾相识感,我之前已经添加了这个(!)但是 Treemap.put 应该添加了以下陷阱。”

 public V put(K key, V value) { Entry<K,V> t = root; if (t == null) { + if (key == null) { + if (comparator == null) + throw new NullPointerException(); + comparator.compare(key, key); + } incrementSize(); root = new Entry<K,V>(key, value, null); return null; }

如果TreeMap的比较器为空,或者比较器不接受空键(符合 API 规范),则意图似乎抛出 NPE。 似乎修复被缩短为一行:

compare(key, key);

定义为:

@SuppressWarnings("unchecked")
final int compare(Object k1, Object k2) {
    return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2)
        : comparator.compare((K)k1, (K)k2);
}

因此,此测试将同时进行空检查和类型检查,即转换为Comparable

我相信这是TreeMap< K,V >在没有提供Comparator情况下检查K实现Comparable 否则你会得到一个ClassCastException

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM