Java put 方法调用与自身比较的目的是什么

问题描述

我在看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() 调用要么什么也不做,要么抛出异常,重点是:尽早抛出。