Javaput方法调用与自身比较的目的是什么
我正在阅读TreeMap的java源代码,对于put方法,当地图为空时,它仍然调用与自己的比较键,这样做的目的是什么?'''
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是正确的type) - 那么这将抛出一个异常。
这是一件好事 - 您希望异常尽早发生。
即使没有定义比较器(即您按照自然排序顺序进行),这也会强制转换keyto Comparable,如果它没有实现该方法,则会抛出 ClassCastException 。
最后,如果您尝试添加null到树状图中并且比较器不喜欢它(或者它是无比较器的 TreeMap),那么您将获得 NPE。
TL;DR:compare()调用要么什么都不做,要么抛出异常,这就是重点:尽早抛出。