Java内存空间重叠?

时间:2011-08-26 04:42:29

标签: java arraylist

我有一个将元素添加到ArrayList的问题。每次执行'add'时,整个数组内容都会替换为当前元素值。我结束了,例如。 10个重复的元素重复。

课程设置如下:

public class BradfordReport {
    EmployeeRow _empRow = new EmployeeRow();
    ArrayList<EmployeeRow> _bradfordData = new ArrayList<EmployeeRow>();

    public void Run() {
       // processing to setup Employee row variables
       for (int x=0; x<10; x++) {
           // This next line in debug IS ADJUSTING THE ARRAYLIST DATA!!
           _empRow.EmpNum = x; // etc for other variable in EmployeeRow
           _bradfordData.add(er);
       }
    }
    // THE RESULT IN _bradfordData is 10 elements, all with EmpNum = 10!
 }

public class EmployeeRow {
    int EmpNum;
    string EmpNm; // etc.
 }

我在这里混淆了Java内存分配吗?似乎EmployeeRow变量和ArrayList共享相同的内存空间 - 非常奇特。谢谢你们

4 个答案:

答案 0 :(得分:4)

您正在将EmployeeRow类的相同实例添加到arraylist中。尝试类似:

public class BradfordReport {
    EmployeeRow _empRow = new EmployeeRow();
    ArrayList<EmployeeRow> _bradfordData = new ArrayList<EmployeeRow>();

    public void Run() {
       // processing to setup Employee row variables
       for (int x=0; x<10; x++) {
           // create a NEW INSTANCE of an EmployeeRow
           _empRow = new EmployeeRow();
           _empRow.EmpNum = x; // etc for other variable in EmployeeRow
           _bradfordData.add(_empRow);
       }
    }
    // THE RESULT IN _bradfordData is 10 elements, all with EmpNum = 10!
}

public class EmployeeRow {
    int EmpNum;
    string EmpNm; // etc.
 }

答案 1 :(得分:2)

每次创建只有一个的EmployeeRow对象。

然后它被修改。 “它”是“同一个对象”。如果需要 new 对象,则创建 new 对象:)

快乐的编码。

答案 2 :(得分:1)

当你这样做时是的

 _empRow.EmpNum = x; 

您正在更改对象内部变量。您需要每次构造一个新对象。在循环内部执行以下操作:

EmployeeRow _empRow = new EmployeeRow();
 _empRow.EmpNum = x; 
 _bradfordData.add(_empRow);

答案 3 :(得分:1)

您没有创建新行,因此每个元素都相同,并且由于循环结束于10,因此最后一个对象的值为10。

public class BradfordReport {
EmployeeRow _empRow = new EmployeeRow();
ArrayList<EmployeeRow> _bradfordData = new ArrayList<EmployeeRow>();

public void Run() {
   // processing to setup Employee row variables
   for (int x=0; x<10; x++) {
       // This next line in debug IS ADJUSTING THE ARRAYLIST DATA!!
       _empRow = new EmployeeRow();
       _empRow.EmpNum = x; // etc for other variable in EmployeeRow
       _bradfordData.add(er);
   }
 }
 // THE RESULT IN _bradfordData is 10 elements, all with EmpNum = 10!
}