2016-06-20 71 views
1

在最近的一次採訪中,我所面臨的問題是如何處理迭代空指針與空密鑰

你如何處理空指針時,迭代器遇到空鍵 而迭代在HashMap中。假設我的開發者已經插入了錯誤的 空鍵

我的回答是:只要我們需要檢查null!=entry.getKey()。 他不滿意,並在此之前說,你將如何處理。

我該如何回答這個問題。當我回來時。

我想這

public class Main { 
    public static void main(String[] args) { 
     Map<String,String> map = new HashMap<String,String>(); 
     map.put(null, "null"); 
     map.put("null",null); 
     map.put("test", "test"); 

     Iterator<Entry<String, String>> it = map.entrySet().iterator(); 
     while(it.hasNext()){ 
      System.out.println(it.next().getKey()); 
     } 
    } 
} 

輸出:

null 
test 
null 

沒有例外。他究竟想要問什麼。或者是我缺少一些概念?請指導我

+2

「他究竟在想其實問嗎?」那麼...你應該詢問面試官。我們怎麼能知道他的想法?在集合或地圖中沒有處理空值的通用方法。這取決於要求。也許事先不允許空值? – Seelenvirtuose

+0

忘了提及。他質疑,假設我的開發人員已經插入了空鍵。編輯問題 – Aadam

+0

您可以使用'HashTable',那麼它將不允許用戶將'null'鍵添加到'HashTable'中。 – Blank

回答

-2

我猜他想通過這個問題測試的關鍵點是什麼在對象Iterator上調用方法next()時發生的事情。

他也許想知道你是否會編程像下面這樣當你要重複的地圖:

Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
     if (null != iter.next().key()) { 
     System.out.println(iter.next()); 
     } 
} 

如果編程就像上面的例子中,next方法調用兩次,和你將不會得到您真正想要檢查的正確對象。相反,你應該寫這樣的代碼:

Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
     // Key point: define a refreence point to the object returned by the 
     // method `next()` 
     Entry entry = iter.next(); 
     if (null != entry.key()) { 
     System.out.println(entry); 
     } 
} 
+0

既然OP給出的答案是'null!= entry.getKey()',那麼調用'next()'兩次的謬誤已經被覆蓋了,所以這不是爲什麼採訪者不滿意。 – Andreas

1
map.remove(null) 

從JavaDoc中:

返回此映射以前關聯的密鑰,或NULL,如果映射不包含無映射值鍵。

如果此映射允許空值,則返回null值不一定表示映射不包含映射關鍵字;地圖也可能將鍵明確地映射到空值。

一旦調用返回,映射將不包含指定鍵的映射。

叫它迭代之前,它會刪除明確null鍵

+0

聰明的回答。 :) – Aadam