Map中使用ArrayList为Value,所有值都相同的的错误
开门见山:问题出在址传递,而非值传递。
首先,我的需求是从一个存储Map的数组中,将编号重复的数据进行整理。
我要做的就是数据整理之后,43作为key,两个不同的MTRLNO拼接起来作为Value。
所以想使用list暂时存储编号,当在Map中使用新key时,清空list中原先的数据,重新存储对应key的编号,并且在遍历循环中同一key下不断的覆盖Value。来达到目的
这里上错误代码
/有问题Map中存放list
String deptNo;
String nextDeptNo;
List mtrlNoList = new ArrayList();
Map deptNoMap = new HashMap();
//这里就是从数据库中获取到需要整理的数据
Map<String, Object>[] lackData = msl02DAO.findLackMtrlNo();
for(int i =0; i<lackData.length;i++){
//厂名
deptNo = (String) lackData[i].get("POSITIONNO");
if(i == 0){
//1、拿到MTRLNO
mtrlNoList.add(lackData[i].get("MTRLNO"));
//设置31的MTRLNO
deptNoMap.put(deptNo, mtrlNoList);
}
//判断(当前位置编号)和(上一条位置编号)是否相等
else if(deptNo.equals(lackData[i-1].get("POSITIONNO"))){
//如果相等,那么list存储相同POSITIONNO的不同MTRLNO
mtrlNoList.add(lackData[i].get("MTRLNO"));
//相同key,覆盖value
deptNoMap.put(deptNo, mtrlNoList);
}else{
//对list进行清空
mtrlNoList.clear();
//再次进行添加
mtrlNoList.add(lackData[i].get("MTRLNO"));
deptNoMap.put(deptNo, mtrlNoList);
}
}
System.out.println(deptNoMap);
第一次循环:走i == 0的代码块,数据正常
第二次循环,首先对ArrayList数据清空,添加进新数据(出现问题)
我们看key= 31的数据,和43的数据是完全一样的。(看编号后缀,原先为311,现在为431),如果还不够明显的话,看下一次循环。
我们发现:同上一次一样,所有key的Value值都是一样的。
这是因为,采用list作为值来存储,Map存储的是list的地址值,而不是其中的实际值。所有key的Value值都是存储的lsit的地址值,所以所有值都相同。