1. 程式人生 > >關於為何TreeMap中用列印語句列印get方法會返回null的原因(解決辦法有待完善)

關於為何TreeMap中用列印語句列印get方法會返回null的原因(解決辦法有待完善)

以上會get到null值,究其原因,可以從get方法原始碼中找到答案。TreeMap集合中實現Map集合的get程式碼如下:

 

    public V get(Object key) {
        Entry<K,V> p = getEntry(key);
        return (p==null ? null : p.value);
    }

  

再繼續往下看 getEntry(key)方法:

 final Entry<K,V> getEntry(Object key) {
        // Offload comparator-based version for sake of performance
        if (comparator != null)
            return getEntryUsingComparator(key);
  //以下程式碼省略

 

這個時候就已經很明顯了,他用到了我們傳入的比較器!!!
接著往下看getEntryUsingComparator(key);

 final Entry<K,V> getEntryUsingComparator(Object key) {
        @SuppressWarnings("unchecked")
            K k = (K) key;
        Comparator<? super K> cpr = comparator;
        if (cpr != null) {
            Entry<K,V> p = root;
            while (p != null) {
                int cmp = cpr.compare(k, p.key);
                if (cmp < 0)
                    p = p.left;
                else if (cmp > 0)
                    p = p.right;
                else
                    return p;
            }
        }
        return null;
    }

這個就很明白了,底層在往出取值的時候用到了我們傳入的比較器中的compare()方法,TreeMap是二叉樹結構儲存資料。當我們拿著鍵去get值時,底層拿著我們傳入的鍵去逐個比對此處呼叫比較器中的compare方法:小於零則往左邊去找,大於零往右去找,只有當等於0時才返回該值,而我們強制compare()方法等於0的時候返回1,所以一直往右邊去找,永遠找不到,直到最後返回null