现在做的项目出现了一个很郁闷的问题,我写了个简化的例子重现了出现的问题
麻烦帮忙看下为什么会出现这个问题,顺便提下解决方案。
---------------------------------------------------------------public class E {
private String fileId;
public E() {
super();
}
public E(String fileId) {
this.fileId = fileId;
} public String getFileId() {
return fileId;
} public void setFileId(String fileId) {
this.fileId = fileId;
}
}
public class C {
private String name;
private String fileId;
public C() {
super();
}
public C(String name, String fileId) {
super();
this.name = name;
this.fileId = fileId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getFileId() {
return fileId;
}
public void setFileId(String fileId) {
this.fileId = fileId;
}


}
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<C>cList=new ArrayList<C>();
List<C>cList2=new ArrayList<C>();
List<E>eList=new ArrayList<E>();
E e1=new E("1");
E e2=new E("2");
C c1=new C();
C c2=new C();
C c3=new C();
c1.setName("a");
c2.setName("b");
c3.setName("c");
cList.add(c1);
cList.add(c2);
cList.add(c3);
eList.add(e1);
eList.add(e2);
for (int i = 0; i < eList.size(); i++) {
E e11=eList.get(i);
for (int j = 0; j < cList.size(); j++) {
C c11=cList.get(j);
c11.setFileId(e11.getFileId());
cList2.add(c11);
}
}
for (int i = 0; i < cList2.size(); i++) {
System.out.println(cList2.get(i).getName()+"---:--"+cList2.get(i).getFileId());
}
}
}结果是
a---:---2
b---:---2
c---:---2
a---:---2
b---:---2
c---:---2
我理解中的结果是
a---:---1
b---:---1
c---:---1
a---:---2
b---:---2
c---:---2
然后我调试发现 当a=2时 add到集合是 会把a1的fileId变成2
后面的类推,研究半天没搞明白Java

解决方案 »

  1.   

    cList2集合中的对象只是引用 , 修改的field都是同一个对象的 , 所以被覆盖了
      

  2.   

    你的两次外循环C c11里获取的是同一个对象,当然它的值就是最后一次被更新的值了。
    解决方案:for (int i = 0; i < eList.size(); i++) {
                E e11=eList.get(i);
                for (int j = 0; j < cList.size(); j++) {
                    C c11=cList.get(j);
                    c11.setFileId(e11.getFileId());
                    cList2.add(c11);
                }
            }
    更改成如下:for (int i = 0; i < eList.size(); i++) {
                E e11=eList.get(i);
                for (int j = 0; j < cList.size(); j++) {
                    C c11= new C(cList.get(j).getName(), cList.get(j).getFileId());
                    c11.setFileId(e11.getFileId());
                    cList2.add(c11);
                }
            }