遇到一小坑 Map引用传递性

最近在写Map递归,然后发现每个树节点的map的值都是一样的,然后一次一次debug,最后发现map的传递性导致的,就像下面一样

    Map<String, String> srcMap = new HashMap<>();
        srcMap.put("a","a");
 
        Map<String, String> addMap2 = srcMap;
        Map<String, String> removeMap2 = srcMap;
 
        addMap2.put("b","b");
        removeMap2.put("c","c");
 
        System.out.println(srcMap);
        System.out.println(addMap2);
        System.out.println(removeMap2);
        //{a=a, b=b, c=c}
        //{a=a, b=b, c=c}
        //{a=a, b=b, c=c}

如果想要使MAP不引用传递,使用以下写法复制新new出来的map

        Map<String, String> srcMap = new HashMap<>();
        srcMap.put("a","a");
        Map<String, String> addMap22 = new HashMap<>(srcMap);
        Map<String, String> removeMap22 =  new HashMap<>(srcMap);;
        addMap22.put("b","b");
        removeMap22.put("c","c");
 
        System.out.println(srcMap);
        System.out.println(addMap22);
        System.out.println(removeMap22);
        //{a=a}
        //{a=a, b=b}
        //{a=a, c=c}

记录下自己的map递归

package TestMessage;


import com.aadata.datacenter.dataManage.utils.tree.TreeUtil;
import com.google.gson.Gson;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class test015 {

    private  static Gson gson = new Gson();

    public static void main(String[] args) throws Exception {



        List<TableMappingModel> list = new ArrayList<>();

        TableMappingModel tableMappingModel1 = new TableMappingModel("1","0","name",1,"","fix","tablename","colname",null,null);
        TableMappingModel tableMappingModel2 = new TableMappingModel("2","1","name2",1,"","fix","tablename2","colname2",null,null);
        TableMappingModel tableMappingModel3 = new TableMappingModel("3","1","name3",1,"","fix","tablename2","colname3",null,null);

        TableMappingModel tableMappingModel4 = new TableMappingModel("4","3","name4",1,"","fix","tablename2","colname4",null,null);

        TableMappingModel tableMappingModel5 = new TableMappingModel("5","3","name5",1,"","fix","tablename2","colname5",null,null);


        TableMappingModel tableMappingModel7 = new TableMappingModel("7","5","name7",1,"","fix","tablename2","colname7",null,null);
        TableMappingModel tableMappingModel8 = new TableMappingModel("8","7","name8",1,"","fix","tablename2","colname8",null,null);

        TableMappingModel tableMappingModel9 = new TableMappingModel("9","7","name9",1,"","fix","tablename2","colname9",null,null);
        list.add(tableMappingModel1);
        list.add(tableMappingModel2);
        list.add(tableMappingModel3);
        list.add(tableMappingModel4);
        list.add(tableMappingModel5);
        list.add(tableMappingModel7);
        list.add(tableMappingModel8);
        list.add(tableMappingModel9);



        TreeUtil treeUtil = new TreeUtil();

        List<TableMappingModel> list1 = treeUtil.toTree(list);

        String s = gson.toJson(list1);
        System.out.println(s);


        Map mapHashMap = new HashMap<>();

        Map<String,Object> map = new HashMap<>();
        map.put("colname2","name2-1");
        map.put("colname3","name3-1");

        Map<String,Object> map1 = new HashMap<>();
        map1.put("colname4","name4-3");
        map1.put("colname5","name5-3");

        Map<String,Object> map3 = new HashMap<>();
        map3.put("colname7","name7-5");

        Map<String,Object> map4 = new HashMap<>();
        map4.put("colname8","name8-7");
        map4.put("colname9","name9-7");

        mapHashMap.put("1",map);
        mapHashMap.put("3",map1);
        mapHashMap.put("5",map3);
        mapHashMap.put("7",map4);


        Map dataModels = new HashMap();

        TableMappingModel tableMappingModel = list1.get(0);
        dataModels.put("root","根节点");


        List<TableMappingModel> tableMappingModelList1 = list1.get(0).getTableMappingModelList();


        commonMeth(mapHashMap, dataModels, tableMappingModelList1);
        System.out.println("zong:;;;"+dataModels);

    }


    private static void commonMeth(Map mapHashMap, Map dataModels, List<TableMappingModel> tableMappingModelList1) {

        for(TableMappingModel one:tableMappingModelList1 ){

                Map  mapEntity = new HashMap<>((Map) mapHashMap.get(one.getPid()));
                if(!CollectionUtils.isEmpty(one.getTableMappingModelList())){
                    // 等于1表示是对象类型
//                    mapEntity = (Map) mapHashMap.get(one.getPid());
                    List<TableMappingModel> childtableMappingModelList = one.getTableMappingModelList();

                    commonMeth(mapHashMap,mapEntity,childtableMappingModelList);
                    dataModels.put(one.getName(),mapEntity);
                }else{

                    dataModels.put(one.getName(),mapEntity);
                }

        }
        System.out.println("0:"+dataModels);

    }


    private static void commonMeth_n(Map mapHashMap, Map dataModels, List<TableMappingModel> tableMappingModelList1) {

        for(TableMappingModel one:tableMappingModelList1 ){
            if(one.getType() ==  2){
                // 等于2 表示是集合类型,list非结构话数据无法再往下拼装子类(因为不知道把子类拼装到这个list的那个实体类中)
                List<Map> listmap = new ArrayList<>();

                List<Map> o = (List<Map>) mapHashMap.get(one.getPid());
                listmap.addAll(o);

                dataModels.put(one.getName(),listmap);

            }else{

                Map  mapEntity = new HashMap<>((Map) mapHashMap.get(one.getPid()));
                if(!CollectionUtils.isEmpty(one.getTableMappingModelList())){
                    // 等于1表示是对象类型
                    mapEntity = (Map) mapHashMap.get(one.getPid());
                    List<TableMappingModel> childtableMappingModelList = one.getTableMappingModelList();
                    commonMeth(mapHashMap,mapEntity,childtableMappingModelList);
                    dataModels.put(one.getName(),mapEntity);
                }else{
                    dataModels.put(one.getName(),mapEntity);
                }

            }
        }

    }


}

实体类

package TestMessage;

import com.aadata.datacenter.dataManage.utils.tree.TreeId;
import com.aadata.datacenter.dataManage.utils.tree.TreeParent;
import com.aadata.datacenter.dataManage.utils.tree.TreeSub;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableMappingModel {

    @TreeId
    private String id;

    /**
     * 父id
     */
    @TreeParent
    private String pid;

    private String name;

    private int type;

    private String appear;

    private String fix;

    private String tableName;

    private String colName;

    private String docBusiId;

    @TreeSub
    List<TableMappingModel> tableMappingModelList;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值