Hashmap中的HashMap给出了不期望的不同结果

时间:2018-04-20 10:14:58

标签: java hashmap

我期待结果如此 AA0={A0=0}, AA1={A1=1}, AA2={A2=2}, AA3={A3=3}, AA4={A4=4}

但是下面的代码我得到了结果 -

{AA4={A2=2, A1=1, A4=4, A3=3, A0=0}, AA2={A2=2, A1=1, A4=4, A3=3, A0=0}, AA3={A2=2, A1=1, A4=4, A3=3, A0=0}, AA0={A2=2, A1=1, A4=4, A3=3, A0=0}, AA1={A2=2, A1=1, A4=4, A3=3, A0=0}}

我在代码中做错了吗?我在调试期间看到的是,第二次运行for循环时,hashMap1甚至在执行{AA0={A1=1}}之前包含hashMap1.put("AA"+i,hashMap2)。我不确定为什么会这样。有人可以帮我理解这个吗?

import java.util.HashMap;

public class testingMapList {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        HashMap<String, HashMap<String, Integer>> hashMap1 = new HashMap<String, HashMap<String, Integer>>();
        HashMap<String, Integer> hashMap2 = new HashMap<String, Integer>();


        for(int i=0;i<5;i++)
        {   
            hashMap2.clear();     
            hashMap2.put("A"+i, i);                 
            hashMap1.put("AA"+i, hashMap2);
        }

        System.out.println("HashMap1--->"+hashMap1.get("AA").containsValue("A=4"));

    }

}

2 个答案:

答案 0 :(得分:0)

您正在重复使用相同的hashMap2。在循环中创建一个新的而不是清除它:

hashMap2 = new HashMap<>();

更好的是,在循环中声明变量,然后没有意外重复使用地图的风险(通过该变量)。

答案 1 :(得分:0)

下面的代码段应该满足您的要求。

public static void main (String[] args) throws java.lang.Exception
{
    HashMap<String, HashMap<String, Integer>> hash = new HashMap<String, HashMap<String, Integer>>();
    for(int i=0; i<5;i++){
        HashMap<String, Integer> insideHash = new HashMap<String, Integer>();
        insideHash.put("A"+i, i);
        hash.put("AA"+i, insideHash);
    }
    System.out.println(hash);
}

结果

{AA0={A0=0}, AA1={A1=1}, AA2={A2=2}, AA3={A3=3}, AA4={A4=4}}