2011-06-24 32 views
2

這讓我爲難以下段將如何導致布爾強制性的空值,雖然它不是在實際的哈希表對應的按鍵無效:通過哈希鍵迭代時的空值設置

for (List<List<A>> a : hashMap.keySet()) { 
    Boolean mandatory = hashMap.get(a); 
} 
+0

您如何知道HashMap中的實際值不爲null? –

+7

HashMap可以具有空值,但更大的問題是爲什麼您的密鑰是List列表?難道你找不到更好的布爾值鍵嗎? – Paul

+0

@rationalSpring:通過檢查調試器中的值 @Paul沒有那真的是我需要的密鑰 – user695652

回答

2

HashMap將返回nullif the key specified is not bound to a value

問題幾乎可以肯定的是a的比較操作 - 列表 - 對照鍵失敗。

讓我猜你是否在調用put之後修改這些列表(關鍵對象)?您是否刪除了其中一個鍵中的所有條目?記住一個空的列表是equal所有空ArrayLists。進一步記住List.equals()比較列表內容(逐個)以測試相等性。

package sof_6462281; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

/** 
* Demonstrate the fact that the Map uses key.equals(k) to 
* test for key equality. Further demonstrate that it is a 
* very bad idea to use mutable collections are keys to maps. 
*/ 
public class ListAsKey { 
    public static void main(String[] args) { 
     Map<List<A>, Boolean> map = new HashMap<List<A>, Boolean>(); 

     List<A> alist = new ArrayList<A>(); 
     map.put(alist, true); 
     for (List<A> a : map.keySet()) { 
      Boolean b = map.get(a); 
      System.out.format("\t%s([email protected]%d) => %s\n",a, a.hashCode(), map.get(a)); 
     } 

     // you changed your list after the put, didn't you? 
     alist.add(new A()); 
     for (List<A> a : map.keySet()) { 
      Boolean b = map.get(a); 
      System.out.format("\t%s([email protected]%d) => %s\n",a, a.hashCode(), map.get(a)); 
     } 

     alist.clear(); 
     for (List<A> a : map.keySet()) { 
      Boolean b = map.get(a); 
      System.out.format("\t%s([email protected]%d) => %s\n",a, a.hashCode(), map.get(a)); 
     } 
    } 
    public static final class A { /* foo */ } 
} 

結果:

[]([email protected]) => true 
[sof_6462281.List[email protected]]([email protected]) => null 
[]([email protected]) => true 

編輯:加入多個op以上並加入控制檯出來。

0

布爾值可以爲null,因爲它包裝值類型原始布爾值。我不確定你的意思是它在實際散列表中的相應鍵上不是空。您正在迭代密鑰,然後獲取這些密鑰的值。一個鍵的值被插入爲空,所以當你檢索它時,你會得到空值。

+0

是的,我明白,但我插入在關鍵字的布爾值不是空,我也看到它在調試器中的對象也可以說是真實的。但是當我使用循環訪問它時,我得到一個空值 – user695652

+0

您將不得不提供更多的細節。在附註中,爲什麼不使用values()或entrySet()方法遍歷散列映射中的所有值或所有對? –

0

對Map鍵使用可變對象始終是一件危險的事情。如果在插入地圖後仍然保留對這些鍵的引用,那麼很可能這些鍵中的一個將在未來某個時刻被修改,這會使地圖的內容失效。

一個不太可能的,但可能的情況下,即使假設你有點不搞砸了你的List<List<>>關鍵的是,如果你搞砸A類的equals方法,那麼你的任務列表equals方法也將被搞砸了,再次搞砸你的地圖。

看看alphazero的漂亮代碼示例,如果您需要進一步證明您嘗試做的事是一個壞主意。