某天开发的时候遇到了这么一个情况:
1 List<Bean> listOut = new ArrayList<Bean>(); 2 List listBack = new ArrayList(); 3 List listInSide = new ArrayList(); 4 Bean beanBack = new Bean(); 5 6 for (int i = 0; i < listBack.size(); i++) { 7 listInSide = (List) listBack.get(i); 8 if (listInSide.get(listInSide.size() - 1).equals("[AE80]")) { 9 beanBack.setAAZ346(listIn.get(0).toString()); 10 //-------不重要 11 listOut.add(beanBack); 12 } 13 } 14 JSONArray json = JSONArray.fromObject(listOut);
最后输出的json结果有三行,全部都是一样的。但是通过debug查看listBack,确实也是三行数据,但是每一行都是不同的。
通过分步debug观察到第一次循环,在listOut插入一行bean以后,第二次插入会改变之前插入的值。
在网上搜索原因发现很多人像我一样遇到过这个问题。
这个问题其实是Java的对象存储的是地址的原因,list中存储的是实例化的bean的地址,由于多次循环改变了bean的值,所以最后输出的时候,每行都是bean的最后一次的值,
所以输出了三行一样的数据。
解决的办法是:在for循环的内部对bean进行实例化,这样就能保证每个add的对象都是new出来的。
浙公网安备 33010602011771号