2013-02-21 36 views
0

我有一個HashMap的問題。它會在插入新的鍵值對時將引用存儲爲值。HashMap更改值引用

我使用HashMap來更快地訪問存儲在非常分層結構中的對象。當第一對插入時,其地址和原始地址是相同的。在添加另一對之後,存儲在HashMap中的地址被改變。因此,我不能通過HashMap的原始對象。

這是怎麼發生的?

這裏是我如何構造HashMap的代碼。在第二種方法中,在第一個for循環中發生上述情況。

private Map<String, Parameter> createRefMap(Settings settings) { 
    Map<String, Parameter> result = new HashMap<String, Parameter>(); 
    for (ParameterList parameterList : settings.getParameterList()) { 
     result.putAll(createRefMap(parameterList, "SETTINGS")); 
    } 

    return result; 
} 

private Map<String, Parameter> createRefMap(ParameterList parameterList, String preLevel) { 
    Map<String, Parameter> result = new HashMap<String, Parameter>(); 
    String level = preLevel + "/" + parameterList.getName(); 

    for (Parameter parameter : parameterList.getParameter()) { 
     result.put(level + "/" + parameter.getName(), parameter); 
    } 

    for (ParameterList innerParameterList : parameterList.getParameterList()) { 
     result.putAll(createRefMap(innerParameterList, level)); 
    } 

    return result; 
} 

這是我如何把它

this.actRefMap = createRefMap(this.actAppSettings); 
+6

請貼一些代碼 – 2013-02-21 10:40:23

+0

您能否爲您面臨的問題粘貼一些代碼? – Jagannath 2013-02-21 10:41:18

+1

你是什麼意思'地址改變'?你應該使用key來獲取存儲在HashMap中的對象。 – ntalbs 2013-02-21 10:42:44

回答

0

如果我理解正確的話,如果你做這樣的事情:

System.out.println(thing1.toString()); 
myMap.put(key1, thing1); 
myMap.put(key2, thing2); 
System.out.println(thing1.toString()); 

第二的println會以某種方式打印出來的結果一個不同的對象?它是任何特定的對象,還是隨機的一個?你認爲你的問題是不可能的;它會打破一個不可思議的數量的Java程序。

你斷言的一部分是「地址」改變;我不確定你的意思。對象ID,在許多調試器中可見?物理內存地址?再次,如果發生這些事情之一,地圖將被打破。

如果您的實際問題是對thing1的其他引用不再具有引用在映射中的內容,那麼您將在某處更改對thing1的外部引用。

+0

中重現這一點我剛剛發現它。一如既往,它真的很尷尬,但我確實在應用程序的另一部分中更改了地圖。上面的代碼是Model的一部分,它將HashMap作爲ModelEvent的一部分傳遞給正在編輯Map的View。我現在在我的活動中發送了地圖副本。 – 2013-02-21 12:33:28