2016-09-09 5 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 요소를 Map에 입력하면 키가 자체와 비교됩니다. 나는 그것이 왜 그렇게 작동하는지 이해할 수 없다. 모든 통찰력 (주석이 달린 "유형 (및 null 가능) 검사"외)? 왜 그들은 키가 null인지 확인하지 않을까요? 어떤 종류의 "유형"수표가 만들어졌으며 무엇을 위해서입니까?TreeMap 자바 구현 - 첫 번째 요소 넣기

+3

자세한 설명은 http://bugs.java.com/view_bug.do?bug_id=5045147에서 확인할 수 있습니다. – Koekje

답변

2

의견에서 언급했듯이 https://bugs.openjdk.java.net/browse/JDK-5045147이 소개 된 문제입니다.

BT2 : 제언 FIX

더그 레아 쓴다!

"덕분에 나는 '데자뷰의 강한 감각을 가지고 그 문제의 논의에서, 원래의 수정 사항은 다음이었다 전에이 (!)를 추가했지만 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의 경우에 NPE를 던질 것, 또는 비교합니다 (API 스펙을 준수하는) null 키를 허용하지 않습니다. 그것은 수정 한 줄에 단축 된 것 같다 :로 정의

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에 즉 캐스트를 모두 할 것입니다이 테스트 .

0

나는이 더 Comparator가 제공되지 않는 경우 KComparableTreeMap< K,V > 검사를 구현하는 경우 장소입니다 믿습니다. 그렇지 않으면 ClassCastException이됩니다.