问题描述
我在看TreeMap的java源代码,对于put方法,当map为空时,它仍然调用与自己比较键,这样做的目的是什么? '''
public V put(K key,V value) {
TreeMap.Entry<K,V> t = this.root;
if (t == null) {
this.compare(key,key);
this.root = new TreeMap.Entry(key,value,(TreeMap.Entry)null);
this.size = 1;
++this.modCount;
return null;
}
'''
解决方法
检查。
具体来说,compare
方法将在比较器中同时抛出第一个和第二个参数(在这种情况下,它是同一件事),如果它被定义了。在这种情况下,如果比较器出现问题(例如,您提供给 TreeMap 的比较器旨在比较字符串,但它是一个整数映射 - 请记住,TreeMap 早于泛型,有不保证 key
是正确的类型) - 那么现在会抛出异常。
这是一件好事 - 您希望异常尽早发生。
即使没有定义比较器(即您按照自然排序顺序进行),这也会将 key
强制转换为 Comparable
,如果它没有实现方法。
最后,如果您尝试将 null
添加到树形图中而比较器不喜欢它(或者它是无比较器的 TreeMap),那么您会得到一个 NPE。
TL;DR:compare()
调用要么什么也不做,要么抛出异常,重点是:尽早抛出。