最近在写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 {@TreeIdprivate String id;/*** 父id*/@TreeParentprivate String pid;private String name;private int type;private String appear;private String fix;private String tableName;private String colName;private String docBusiId;@TreeSubList<TableMappingModel> tableMappingModelList;
}