HashMap更改值引用

时间:2013-02-21 10:39:23

标签: java reference hashmap

我遇到了HashMap的问题。当插入新的Key-Value-Pairs时,它会更改存储为值的引用。

我使用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);

1 个答案:

答案 0 :(得分:0)

如果我理解正确,如果你这样做:

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

第二个println会以某种方式打印出来自不同对象的结果吗?它是任何特定的对象,还是随机的一个?你所说的问题是不可能的;它会打破一些无法想象的java程序。

你的断言的一部分是“地址”的变化;我不确定你的意思。对象id,在许多调试器中可见?物理内存地址?同样,如果发生这些事情中的任何一件事,地图就会被打破。

如果您的实际问题是对thing1的其他一些引用不再具有地图中引用的内容,那么您将在某处更改对thing1的外部引用。