0

HashMap に問題があります。新しいキーと値のペアが挿入されると、値として格納されている参照が変更されます。

HashMap を使用して、他の方法では非常に階層構造に格納されているオブジェクトにすばやくアクセスします。最初のペアが挿入されたとき、そのアドレスと元のアドレスは同じです。別のペアを追加すると、HashMap に格納されているアドレスが変更されます。そのため、HashMap を介して元のオブジェクトを取得できません。

なぜこうなった?

これは、HashMap を構築する方法のコードです。2 番目の方法では、最初の 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());

2 番目の println が何らかの形で別のオブジェクトからの結果を出力するということですか? 特定のオブジェクトですか、それともランダムに 1 つだけですか? あなたが問題として述べたことは不可能です。考えられないほどの数の Java プログラムが壊れてしまいます。

あなたの主張の一部は、「アドレス」が変わるということです。それが何を意味するのかわかりません。多くのデバッガーで表示されるオブジェクト ID? 物理メモリアドレス?繰り返しますが、これらのいずれかが発生した場合、Map は破損します。

実際の問題が、thing1 への他の参照がマップ内の参照の内容を持たなくなっていることである場合、その外部参照をthing1 のどこかに変更しています。

于 2013-02-21T12:26:32.697 に答える