#java #list #loops #object #arraylist
#java #Список #циклы #объект #arraylist
Вопрос:
У меня есть список целых чисел в виде
List<Integer> list = new ArrayList<Integer>();
чисел, взятых из базы данных (этот список содержит 46 различных чисел), и я должен заполнить список пользовательских объектов следующим образом
List<CustomObject> listNumber2 = new ArrayList<CustomObject>;
CustomObject — это:
public class CustomObject {
private int DBIndex;
private double value;
//Getters and Setters follow
}
Я использовал этот фрагмент кода для заполнения listNumber2
:
Scanner input = new Scanner(System.in);
CustomObject temp = new CustomObject();
for(Integer i:lista) {
temp.setDBIndex(i);
System.out.print("Insert value for index no. " i " --> ");
temp.setValue(input.nextDouble());
listNumber2.add(temp);
}
Чтобы проверить значения, которые я напечатал list
перед заполнением listNumber2
, и все было в порядке, затем заполнил его и напечатал: оно было в 46 ( listNumber2.size()
) раз больше последнего значения DBIndex
и в 46 раз больше последнего значения value
…
Я попытался изменить одну или две мелочи, но все было по-прежнему, затем запустил отладчик.
На вкладке Variables
указано ( v
и >
в виде стрелок):
Name | Value
v list | ArrayList<E> (id=38)
v elementData | Object[49] (id=42)
v [0] | Integer(id=43)
value | 10
> [1] | Integer(id=47)
> [2] | Integer(id=48)
> ... | ...
> modCount | 46
> size | 46
v listNumber2 | ArrayList<E> (id=15)
v elementData | Object[10] (id=41)
v [0] | CustomObject (id=36)
DBIndex | 79
value | 4.45
v [1] | CustomObject (id=36)
DBIndex | 79
value | 4.45
> [2] | CustomObject (id=36)
> ... | ...
v modCount | 46
v size | 46
Каждый раз, во время отладки, он передавал инструкцию temp.setDBIndex(i);
every DBIndex
of listNumber2
, измененную в новую i
из for
цикла, и новое значение Scanner
заполненного каждого value
перезаписывало предыдущее, после temp.setValue(input.nextDouble());
, так что, в конце концов, каждый объект в списке имеет одинаковые значения. Кроме того, как вы можете видеть в разделе переменные, каждый объект в списке имеет тот же идентификатор, что и скопированный.
Как это вообще возможно? Есть ли у меня какой-нибудь альтернативный вариант решения этой проблемы?
Ответ №1:
Вместо создания 46 экземпляров CustomObject вы добавляете один и тот же объект 46 раз — поэтому, когда вы меняете его в цикле, он изменяется для всех ссылок, которые фактически указывают на один и тот же объект в памяти. Решение состоит в том, чтобы перейти CustomObject temp = new CustomObject();
в цикл for .
Ответ №2:
попробуйте поместить инициализацию CustomObject в цикл, потому что listNumber2 должен содержать отдельные объекты.