關於為何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