使用HashMap时碰到的串值问题
hashmap,对象,存储,java2016-06-12
转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/51649404
相关文章:
碰到一个场景是利用List存储HashMap对象,然后分别更新每个对象的指定Key对应的value。利用到了两组List,都存有内容相仿的HashMap对象。
创建了2个List,分别往其中添加对象。做了100次循环,循环处理条件是i大于10,其中一个list里面的一个对象值加1,正常情况应该是一个最终的值为11,一个为89.
public class Test01 {
public static void main(String[] args){
List<HashMap<String,Object>> list_pass = new ArrayList<HashMap<String,Object>>();
List<HashMap<String,Object>> list_reject = new ArrayList<HashMap<String,Object>>();
for(int i=0;i<9;i++){
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("choice_id", 1);
map.put("score_id", 1);
map.put("score_name", "测试");
map.put("number", 0);
list_pass.add(map);
list_reject.add(map);
}
System.out.println("list_pass:"+list_pass.size()+",list_reject:"+list_reject.size());
for(int j=0;j<100;j++){
if(j > 10){
for(int k=0;k<list_reject.size();k++){
HashMap<String,Object> map_reject = list_reject.get(k);
int map_score_id = Integer.parseInt(String.valueOf(map_reject.get("score_id")));
if(map_score_id == 1){
int map_count_pass = Integer.parseInt(String.valueOf(map_reject.get("number")));
map_count_pass = map_count_pass + 1;
map_reject.put("number", map_count_pass);
System.out.println("map_reject:"+map_count_pass);
break;
}
}
}else{
for(int k=0;k<list_pass.size();k++){
HashMap<String,Object> map_pass = list_pass.get(k);
int map_score_id = Integer.parseInt(String.valueOf(map_pass.get("score_id")));
if(map_score_id == 1){
int map_count_pass = Integer.parseInt(String.valueOf(map_pass.get("number")));
map_count_pass = map_count_pass + 1;
map_pass.put("number", map_count_pass);
System.out.println("map_pass:"+map_count_pass);
break;
}
}
}
}
System.out.println("list_pass:"+list_pass.toString()+",list_reject:"+list_reject.toString());
}
}
看看运行结果:
list_pass:[{score_name=测试, score_id=1, number=100, choice_id=1}],list_reject:[{score_name=测试, score_id=1, number=100, choice_id=1}]
结果与想的不一致,肯定是处理环节出问题了,细看,问题应该就出在初始化List问题上,下面为初始化代码,HashMap只new了一次,同时被两个地方引用,因此出现了串值。
for(int i=0;i<9;i++){
HashMap<String,Object> map = new HashMap<String,Object>();
map.put("choice_id", 1);
map.put("score_id", 1);
map.put("score_name", "测试");
map.put("number", 0);
list_pass.add(map);
list_reject.add(map);
}
试试用两个HashMap对象。
运行结果正确:
list_pass:[{score_name=测试, score_id=1, number=11, choice_id=1}],list_reject:[{score_name=测试, score_id=1, number=89, choice_id=1},]
在往不同对象中封装HashMap时,一定要考虑是否会发生串值影响,可以通过重新new HashMap对象来消除该影响。