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

马辛·米科拉伊奇奇(MarcinMikołajczyk)
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是否为null?在那里进行什么样的“类型”检查?

曼努蒂

如评论中所述,https://bugs.openjdk.java.net/browse/JDK-5045147是引入此问题的问题。从该问题的讨论中,最初的解决方法是:

BT2:建议的修复

道格·李写道:

“谢谢!我对deja vu有很强的意识,我已经在(!)之前添加了此功能,但是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);
}

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TreeMap获取第一个元素并删除

Java中的TreeMap实现仅返回最后一个元素

Java Treemap放置方法

Java访问枚举的第一个元素

Java的使用排序蒸VS TreeMap的一个地图

Java检查LinkedList的最后一个元素,该元素是TreeMap的一部分

在Java TreeMap中查找元素位置

从元素的排序列表构建Java TreeMap

为除第一个元素以外的所有元素实现代码

Java列表处理第一个和最后一个元素

Java split()返回一个空的第一个元素

使用数组的第一个元素作为顶部实现堆栈

我想通过单击第一个和最后一个元素来实现卡的旋转

迭代 Java Map 但在跳过第一个元素之后

java-将列表迭代器重置为列表的第一个元素

Java的8 - 可选<CustomizedObject>获得内CustomizedObject列表的第一个元素

可选的<List> Java 8 Lambda表达式获取第一个元素

Java泛型方法进行筛选,找到列表第一个元素

如何从JAVA 11中的stream filter()获取第一个匹配元素?

如何从JAVA 11中的stream filter()获取第一个匹配元素?

Java Stream:如何仅更改流的第一个元素?

在不使用Java的情况下删除数组的第一个元素

如何过滤出不匹配在Java顺序流的谓词的第一个元素?

检查Java中扫描程序的第一个元素

搜索正在跳过Java链表中的第一个元素

Java流:流的第一个元素减去流的其余部分的总和

Java XPATH 只选择 child 的第一个元素

使用Java8流过滤列表并获取第一个元素

按内部列表的第一个元素对列表列表进行排序(Java或groovy)