『Java』解决list添加同一对象覆盖原有数据问题

这个方法不是唯一的方法,其实最简单的方法就是我在第二个for循环里面重新new一个vmNew对象,然后通过set和get方法将vm对象的值一个一个的set到vmNew里面,但是由于我们这个vm对象里面几十个字段,一个一个写麻烦,而且我今天较真了,所以有了以下的方式,随笔记录,希望对大家有帮助!!! 

对象vm将重新set对象值后重新add到list里面,覆盖前面add的值,一下方法是实现了不覆盖原来的值的方案,如下代码所示:

List newList = new ArrayList();

if(vms!=null && vms.size()>0) {

    for(VirtualMachine vm : vms) {

          if(InitInfo.vmDiskMap.containsKey(vcIp+"_"+vm.getVmId()))  {

              List diskList =  InitInfo.vmDiskMap.get(vcIp+"_"+vm.getVmId());

              if(diskList!=null && diskList.size()>0) {

                  for(VirtualMachineDisk disk :  diskList) {

                        VirtualMachine vm1 = new VirtualMachine();

                        vm1.setLunId(disk.getLunId());

                        vm1.setLunName(disk.getStoreName());

                        vm1.setLunSize(disk.getDiskSize());

                        newList.add(vm1);

                  }

              }

          }

    }

}

以上是会覆盖原有对象的代码,即使重新new了对象,也会覆盖掉,原因就是对象使用=号赋值,是将内存的索引给了新的对象,其实内存位置没变,还是指向原来的对象。 

以下是我通过alibaba的JSONObject来进行对象类型转换的方式实现不覆盖原有对象内容。

List newList = new ArrayList();

if(vms!=null && vms.size()>0) {

    for(VirtualMachine vm : vms) {

          if(InitInfo.vmDiskMap.containsKey(vcIp+"_"+vm.getVmId()))  {

              List diskList =  InitInfo.vmDiskMap.get(vcIp+"_"+vm.getVmId());

              if(diskList!=null && diskList.size()>0) {

                  for(VirtualMachineDisk disk :  diskList) {

                        vm.setLunId(disk.getLunId());

                        vm.setLunName(disk.getStoreName());

                        vm.setLunSize(disk.getDiskSize());

                        newList.add((JSONObject)  JSONObject.toJSON(vm));

                  }

              }

          }

    }

}

List list = new  ArrayList();

for(JSONObject obj : newList) {

    list.add(JSONObject.toJavaObject(obj,  VirtualMachine.class));

}

请忽略代码中间一些无用的代码,那些是项目所需的业务逻辑,我懒得写demo了,直接上工程源码片段。

每天进步一点点,坚持带来大改变。

你可能感兴趣的:(『Java』解决list添加同一对象覆盖原有数据问题)