2017-02-16 61 views
0

也不例外所以我最近在做用地圖進行了一些編碼,我無意中發現在這個NullPointerExceptionNullPointerException異常上的containsKey上TreeMap的VS上的HashMap

Map<Integer, Integer> map = new TreeMap<>(); 
map.put(1,1); 
map.containsKey(null); 

這扔了標準NullPointerException。 然而,因爲這是在爲一隻手,我知道,其他人並沒有得到在某些事正在用手此異常怪異,所以我測試了:

Map<Integer, Integer> map = new HashMap<>(); 
map.put(1,1); 
map.containsKey(null); 

這並沒有拋出異常。

,基本上我想知道爲什麼此行爲已存在的,因爲hashmaptreemap之間最佳的行爲應該是相同的除了時間做某些功能。

回答

2

Map.containsKey(Object key),你會發現異常情況的說明:

NullPointerException - 如果指定鍵爲null並且此映射不允許null鍵(可選)

因此,它是直到執行決定拋出或不拋出(拋出在聲明中定義拋出的詞語)

你看到在HashMap.containsKey(Object key)它沒有按照你的預期定義代碼。

0

因爲實現是不同的。

TreeMap中拋出:See here

  • ClassCastException - 如果指定鍵不能與映射中的當前的 鍵進行比較
  • NullPointerException - 如果指定鍵 爲null並且此映射使用自然順序,或者它的比較器確實是 不允許空密鑰

HashMap不會拋出並返回布爾值。 See here

1

要在AxelH的一個繆拉的答案闡述:讓我們來看看源代碼

TreeMap的

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

final Entry<K,V> getEntry(Object key) { 
    // Offload comparator-based version for sake of performance 
    if (comparator != null) 
     return getEntryUsingComparator(key); 
    if (key == null) 
     throw new NullPointerException(); 
    ... 
} 

正如你看到的,它拋出一個NPE如果key == null

的HashMap

transient Entry[] table; 

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    ... 
} 

private V getForNullKey() { 
    for (Entry<K,V> e = table[0]; e != null; e = e.next) { 
     if (e.key == null) 
      return e.value; 
    } 
    return null; 
} 

至於HashMapget()檢查是否有與主要nullEntry,並返回Entry的價值。

相關問題