2016-09-09 4 views
2
public V put(K key, V value) { 
    Entry<K,V> t = root; 
    if (t == null) { 
     compare(key, key); // type (and possibly null) check 
     root = new Entry<>(key, value, null); 
     size = 1; 
     modCount++; 
     return null; 
    } 
    int cmp; 
    ... 
} 

final int compare(Object k1, Object k2) { 
    return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2) 
     : comparator.compare((K)k1, (K)k2); 
} 

私のアプリケーションでいくつかのバグに直面した後、私はTreeMaps putメソッドをデバッグしなければなりませんでした。私の問題は、マップに入れられたオブジェクトの比較でした。奇妙なのは、私がFIRST要素をマップに置くと、そのキーはそれ自身と比較されます。私はそれがなぜそんなにうまくいくのか理解できません。任意の洞察(コメントされた「タイプ(およびnullの可能性もある)チェック」以外)?キーがnullであるかどうかを確認するのはなぜですか?どのような "タイプ"チェックが行われたのか、何のために?TreeMap java実装 - 第1要素を入れよう

+3

ここでさらに詳しい説明があります:http://bugs.java.com/view_bug.do?bug_id=5045147 – Koekje

答えて

2

コメントに記載されているように、https://bugs.openjdk.java.net/browse/JDK-5045147は、これが導入された問題です。

BT2:提案FIX

ダグ・リー書き込みます!

」おかげで私は「既視感を持っているという問題での議論からは、オリジナルの修正は、以下でしたve これ以前に(!)を追加しましたが、Treemap.putにはトラップを追加した が必要です。

public V put(K key, V value) { 
    Entry<K,V> t = root; 

    if (t == null) { 
    + if (key == null) { 
    + if (comparator == null) 
    + throw new NullPointerException(); 
    + comparator.compare(key, key); 
    + } 
     incrementSize(); 
     root = new Entry<K,V>(key, value, null); 
     return null; 
    } 

意図はTreeMapのコンパレータがnullの場合、またはコンパレータは、(API仕様に準拠)nullキーを受け付けない場合にNPEを投げているようです。修正が1行に短縮されたようだ。

のように定義されて
compare(key, key); 

@SuppressWarnings("unchecked") 
final int compare(Object k1, Object k2) { 
    return comparator==null ? ((Comparable<? super K>)k1).compareTo((K)k2) 
     : comparator.compare((K)k1, (K)k2); 
} 

したがって、このテストはComparableにnullをチェックと型チェック、すなわちキャストの両方を行います。

0

私は、これは何のComparatorが提供されていない場合KComparableを実装している場合TreeMap< K,V >チェック場所であると信じています。そうでなければClassCastExceptionが得られます。

関連する問題