添加新的键值对时,Hashmap 条目将被替换
Hashmap entries are replacing when adding new key value pair
我必须使用 loop.When 将一些列表数据添加到 hashmap 我使用不同的键将第二个列表添加到 hashmap hashmap 中的第一个列表被第二个列表替换 also.Why 这个发生了什么?请帮我解决这个问题。下面是我的代码
private List<COAAccount> dataCoa=new ArrayList<COAAccount>();
private List<COAAccount> finalList=new ArrayList<COAAccount>();
private Map<Integer,List<COAAccount>> brkDBMap;
private Map<Integer,List<COAAccount>> brkVwMap=new HashMap<Integer, List<COAAccount>>();
我已经将一些值加载到 brkDBMap.Then,
Iterator itDB = brkDBMap.entrySet().iterator();
while (itDB.hasNext()) {
Map.Entry pairs = (Map.Entry)itDB.next();
int key=(int) pairs.getKey();
List<COAAccount> valueList=(List<COAAccount>) pairs.getValue();
if(brkVwMap.containsKey(key)) {
System.out.println("****EXIST******");
}else{
//finalList=new ArrayList<COAAccount>();
finalList = new ArrayList<COAAccount>(dataCoa);
Iterator<COAAccount> itertrMap=valueList.iterator();
while(itertrMap.hasNext()){
int s=-1;
COAAccount importCoa=new COAAccount();
importCoa=restTemplate.postForObject("http://localhost:8080/SaveIt/stock/getCopyBudget", itertrMap.next(),COAAccount.class);
switch (importCoa.getAccPerId()) {
case 0: s =9;
break;
case 1: s=10;
break;
case 2: s=11;
break;
case 3: s=0;
break;
case 4: s=1;
break;
case 5: s=2;
break;
case 6: s=3;
break;
case 7: s=4;
break;
case 8: s=5;
break;
case 9: s=6;
break;
case 10:s=7;
break;
case 11:s=8;
break;
default:
break;
}
COAAccount impCAcct=new COAAccount();
impCAcct=finalList.get(s);
impCAcct.setBudBrk(importCoa.getiD(), importCoa.getBudID(), importCoa.getAccPerId(), importCoa.getBudgetAmount(), importCoa.getDescAdd());
finalList.set(s, impCAcct);
}
brkVwMap.put(key,finalList);
}
}
此处 brkDBMap 和 brkVwMap hashmap.I 需要将列表添加到 brkVwMap.If 我想分别为键 1 和键 2 插入值 "Account1" 和 "Account2" 到 brkVwMap ,然后在添加 "Account2" 之后,地图变为 {1=[Account2], 2=[Account2]} 而不是 {1=[Account1], 2=[Account2]}
brkVwMap.put(key,finalList);
您添加到地图的值是 finalList
,它由 :
初始化
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
您没有显示 dataCoa
的初始化位置,但我怀疑它只初始化了一次,所以您地图中的所有值都将相同。
您注释掉的那行更有意义。
如果你想用 dataCoa
的内容初始化 finalList
,但对于映射的不同键仍然有不同的值,你应该写:
finalList = new ArrayList<COAAccount>(dataCoa);
使用 finalList=dataCoa;
您创建了一个浅表副本,因此您使用 finalList 的每个引用(即 HashMap 中的每个值)都指向相同的列表 dataCoa 而您每当更改 finalList 中的值时更改 dataCoa。
例如,您可以使用这样的东西:
List<String> a = new ArrayList<String>();
a.add("a");
List<String> b = a;
b.add("b");
List<String> c = new ArrayList<String>(a);
c.add("c");
System.out.println(a);
System.out.println(b);
System.out.println(c);
这样,b 是与 a 相同的列表,而 c 是深拷贝,其中所有元素都被复制到一个新列表中,并且更改不会反映在 a 和 b 上。
结果输出为:
[a, b]
[a, b]
[a, b, c]
所以 Eran 说你的代码是对的
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
应该是:
finalList=new ArrayList<COAAccount>(dataCoa);
//finalList=dataCoa;
第二行当然必须是 commented/deleted,否则你会用之前出现问题的相同引用覆盖新列表 ;)
我必须使用 loop.When 将一些列表数据添加到 hashmap 我使用不同的键将第二个列表添加到 hashmap hashmap 中的第一个列表被第二个列表替换 also.Why 这个发生了什么?请帮我解决这个问题。下面是我的代码
private List<COAAccount> dataCoa=new ArrayList<COAAccount>();
private List<COAAccount> finalList=new ArrayList<COAAccount>();
private Map<Integer,List<COAAccount>> brkDBMap;
private Map<Integer,List<COAAccount>> brkVwMap=new HashMap<Integer, List<COAAccount>>();
我已经将一些值加载到 brkDBMap.Then,
Iterator itDB = brkDBMap.entrySet().iterator();
while (itDB.hasNext()) {
Map.Entry pairs = (Map.Entry)itDB.next();
int key=(int) pairs.getKey();
List<COAAccount> valueList=(List<COAAccount>) pairs.getValue();
if(brkVwMap.containsKey(key)) {
System.out.println("****EXIST******");
}else{
//finalList=new ArrayList<COAAccount>();
finalList = new ArrayList<COAAccount>(dataCoa);
Iterator<COAAccount> itertrMap=valueList.iterator();
while(itertrMap.hasNext()){
int s=-1;
COAAccount importCoa=new COAAccount();
importCoa=restTemplate.postForObject("http://localhost:8080/SaveIt/stock/getCopyBudget", itertrMap.next(),COAAccount.class);
switch (importCoa.getAccPerId()) {
case 0: s =9;
break;
case 1: s=10;
break;
case 2: s=11;
break;
case 3: s=0;
break;
case 4: s=1;
break;
case 5: s=2;
break;
case 6: s=3;
break;
case 7: s=4;
break;
case 8: s=5;
break;
case 9: s=6;
break;
case 10:s=7;
break;
case 11:s=8;
break;
default:
break;
}
COAAccount impCAcct=new COAAccount();
impCAcct=finalList.get(s);
impCAcct.setBudBrk(importCoa.getiD(), importCoa.getBudID(), importCoa.getAccPerId(), importCoa.getBudgetAmount(), importCoa.getDescAdd());
finalList.set(s, impCAcct);
}
brkVwMap.put(key,finalList);
}
}
此处 brkDBMap 和 brkVwMap hashmap.I 需要将列表添加到 brkVwMap.If 我想分别为键 1 和键 2 插入值 "Account1" 和 "Account2" 到 brkVwMap ,然后在添加 "Account2" 之后,地图变为 {1=[Account2], 2=[Account2]} 而不是 {1=[Account1], 2=[Account2]}
brkVwMap.put(key,finalList);
您添加到地图的值是 finalList
,它由 :
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
您没有显示 dataCoa
的初始化位置,但我怀疑它只初始化了一次,所以您地图中的所有值都将相同。
您注释掉的那行更有意义。
如果你想用 dataCoa
的内容初始化 finalList
,但对于映射的不同键仍然有不同的值,你应该写:
finalList = new ArrayList<COAAccount>(dataCoa);
使用 finalList=dataCoa;
您创建了一个浅表副本,因此您使用 finalList 的每个引用(即 HashMap 中的每个值)都指向相同的列表 dataCoa 而您每当更改 finalList 中的值时更改 dataCoa。
例如,您可以使用这样的东西:
List<String> a = new ArrayList<String>();
a.add("a");
List<String> b = a;
b.add("b");
List<String> c = new ArrayList<String>(a);
c.add("c");
System.out.println(a);
System.out.println(b);
System.out.println(c);
这样,b 是与 a 相同的列表,而 c 是深拷贝,其中所有元素都被复制到一个新列表中,并且更改不会反映在 a 和 b 上。 结果输出为:
[a, b]
[a, b]
[a, b, c]
所以 Eran 说你的代码是对的
//finalList=new ArrayList<COAAccount>();
finalList=dataCoa;
应该是:
finalList=new ArrayList<COAAccount>(dataCoa);
//finalList=dataCoa;
第二行当然必须是 commented/deleted,否则你会用之前出现问题的相同引用覆盖新列表 ;)