2013-02-21 37 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