[英]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.