0

我对 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);
4

1 回答 1

0

如果我理解正确,如果您执行以下操作:

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

第二个 println 会以某种方式打印出来自不同对象的结果?它是任何特定的对象,还是随机的一个?您所说的问题是不可能的;它会破坏数量惊人的 Java 程序。

您的部分断言是“地址”发生了变化;我不确定你的意思。在许多调试器中可见的对象 ID?物理内存地址?同样,如果发生上述任何一种情况,Map 就会被破坏。

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

于 2013-02-21T12:26:32.697 回答