2016-09-09 3 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) check ")? Почему бы им просто не проверить, был ли ключ пустым? Какой вид «типа» проверяется и зачем?TreeMap java implementation - put 1st element

+3

Здесь вы можете найти еще несколько объяснений: http://bugs.java.com/view_bug.do?bug_id=5045147 – Koekje

ответ

2

Как упоминалось в комментарии, https://bugs.openjdk.java.net/browse/JDK-5045147 - вопрос, где это было введено. Из обсуждения в этом вопросе, оригинальное исправление было следующее:

ВТ2: РЕКОМЕНДУЕМЫЙ FIX

Doug Lea пишет:

«Спасибо У меня есть сильное ощущение дежавю, что я» 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; 
    } 

Намерение кажется бросить NPE в случае компаратор из TreeMap является нулевым, или компаратор не принимает нулевые ключи (что соответствует спецификации API). Кажется, исправление было сокращено до одной строки:

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

Я считаю, что это место, где TreeMap< K,V > проверяет, K реализует Comparable если нет Comparator не подается. В противном случае вы получите ClassCastException.