Пространство памяти Java перекрывается? - PullRequest
1 голос
/ 26 августа 2011

У меня проблема с добавлением элементов в 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 ]

4 голосов
/ 26 августа 2011

Вы добавляете тот же экземпляр класса EmployeeRow в массив. Попробуйте что-то вроде:

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.
 }
2 голосов
/ 26 августа 2011

Только один Каждый объект EmployeeRow создается.

Затем он изменяется.«Это» будучи «тем же объектом».Если требуется объект новый , создайте объект новый :)

Счастливое кодирование.

1 голос
/ 26 августа 2011

Вы не создаете новые строки, поэтому все элементы одинаковы, и поскольку цикл заканчивается в десять, последний объект имеет значение десять.

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!
}
1 голос
/ 26 августа 2011

Да, когда вы делаете

 _empRow.EmpNum = x; 

вы меняете внутреннюю переменную объектов. Вам нужно каждый раз создавать новый объект. Внутри цикла сделайте что-то вроде этого:

EmployeeRow _empRow = new EmployeeRow();
 _empRow.EmpNum = x; 
 _bradfordData.add(_empRow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...