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

时间:2016-09-09 13:21:18

标签: java collections treemap

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时,它会与自身进行比较。我无法理解为什么它会像那样工作。任何见解(除了评论“类型(可能为空)检查”)?他们为什么不检查密钥是否为空?在那里进行了什么样的“类型”检查以及为什么?

2 个答案:

答案 0 :(得分:2)

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

  

BT2:建议修复

     Doug Lea写道:

     

&#34;谢谢!我有一种强烈的似曾相识的感觉   之前添加了这个(!)但是Treemap.put应该有   跟随陷阱添加。&#34;

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

答案 1 :(得分:0)

如果TreeMap< K,V >没有提供K,我相信这是Comparable检查Comparator是否实施ClassCastException的地方。否则你会得到Spatial Data Type