這讓我爲難以下段將如何導致布爾強制性的空值,雖然它不是在實際的哈希表對應的按鍵無效:通過哈希鍵迭代時的空值設置
for (List<List<A>> a : hashMap.keySet()) {
Boolean mandatory = hashMap.get(a);
}
這讓我爲難以下段將如何導致布爾強制性的空值,雖然它不是在實際的哈希表對應的按鍵無效:通過哈希鍵迭代時的空值設置
for (List<List<A>> a : hashMap.keySet()) {
Boolean mandatory = hashMap.get(a);
}
HashMap將返回null
if 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以上並加入控制檯出來。
布爾值可以爲null,因爲它包裝值類型原始布爾值。我不確定你的意思是它在實際散列表中的相應鍵上不是空。您正在迭代密鑰,然後獲取這些密鑰的值。一個鍵的值被插入爲空,所以當你檢索它時,你會得到空值。
是的,我明白,但我插入在關鍵字的布爾值不是空,我也看到它在調試器中的對象也可以說是真實的。但是當我使用循環訪問它時,我得到一個空值 – user695652
您將不得不提供更多的細節。在附註中,爲什麼不使用values()或entrySet()方法遍歷散列映射中的所有值或所有對? –
對Map鍵使用可變對象始終是一件危險的事情。如果在插入地圖後仍然保留對這些鍵的引用,那麼很可能這些鍵中的一個將在未來某個時刻被修改,這會使地圖的內容失效。
一個不太可能的,但可能的情況下,即使假設你有點不搞砸了你的List<List<>>
關鍵的是,如果你搞砸A
類的equals
方法,那麼你的任務列表equals
方法也將被搞砸了,再次搞砸你的地圖。
看看alphazero的漂亮代碼示例,如果您需要進一步證明您嘗試做的事是一個壞主意。
您如何知道HashMap中的實際值不爲null? –
HashMap可以具有空值,但更大的問題是爲什麼您的密鑰是List列表?難道你找不到更好的布爾值鍵嗎? – Paul
@rationalSpring:通過檢查調試器中的值 @Paul沒有那真的是我需要的密鑰 – user695652