Map对象指针和Map.clear()

这两天调试项目的接口,2个接口都出现错误,问题排查很繁琐。但是排查出问题之后,发现出现的问题很逗比。记录下来纪念下逗比的程序之路


先上2段代码:
代码1

        Map<String ,Object> newmap =null;
        for(Map<String ,Object> map :listmap){
            newmap =new HashMap<String ,Object>();
            for(String param :listVirtualMachines_param){
                if(map.get(param)==null)
                    newmap.put(param, "");
                else
                    newmap.put(param, map.get(param));
            }
            listVcRe.add(newmap);
        }

代码2

        Map<String ,Object> newmap =new HashMap<String ,Object>();
        for(Map<String ,Object> map :listmap){
            newmap.clear();
            for(String param :listVirtualMachines_param){
                if(map.get(param)==null)
                    newmap.put(param, "");
                else
                    newmap.put(param, map.get(param));
            }
            listVcRe.add(newmap);
        }

以上2段代码,初看都是遍历循环listmap里面的对象,然后对map对象判断后封装到listVcRe。但是代码1可以达到目的,代码2就不行。使用代码2得到的listVcRe里面是N个相同的listmap[n-1]。不知道我这样描述大家是否能懂。

上面2个代码片段里面有个很重要而且很常用的知识点—–map指针。

首先2个for循环里面的每个map对象都是取的listmap里面的指针对象,对map进行操作 ,实际上是直接对listmap里面的一个map进行操作。这样说来,如果将一个map 放入listVcRe列表里面,其实代码1是把一个新的map指针放入listVcRe里面,代码2是把listmap里面的map对象的指针放入listVcRe里面。那现在代码1和代码2的区别就出了了,如果对2个代码片段进行执行,执行结果:

代码1:
[map1,map2,map3,....]
代码2:
[listmap[n-1],listmap[n-1],listmap[n-1],....]

本次的项目错误的问题原因就出现在这里,没有深入理解map指针对象,错误的使用clear()函数。

你可能感兴趣的:(java)