Могу ли я изменить объекты в одном ArrayList, используя ссылки в другом? - PullRequest
2 голосов
/ 15 августа 2011

Первый список массивов: - ArrayList<Object> list1;
Второй список массивов: - ArrayList<Object> list2;

Предположим, я заполнил list1 некоторыми объектами.Теперь я копирую некоторые объекты из list1, используя list2.add(list1[i]), и изменяю объект в list2, используя list2[j].setA = something.

Изменится соответствующее значение A объекта в списке list1 или нет?На самом деле я хочу, чтобы значение A было изменено.

Ответы [ 3 ]

9 голосов
/ 15 августа 2011

Это изменится. Списки содержат только ссылки на объекты *. Поэтому после добавления некоторых элементов из list1 в list2 два списка будут иметь ссылки на одни и те же физические объекты.

* В коллекциях Java нельзя хранить примитивные типы, такие как int, только их аналоги объекта (в данном случае Integer), всегда по ссылке.

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

A java.util.List (включая ArrayList и LinkedList) содержит ссылки на объекты.То есть, если у вас есть один экземпляр объекта и вы поместите этот экземпляр в два списка, эти два списка будут ссылаться на один и тот же фактический объект.

Фактически, в Java нет «объектов-значений»в отличие от некоторых других языков (например, C, C ++ и C #).Ни переменные, ни массивы (и, как следствие, любой из классов коллекций, таких как List) не могут содержать объекты.Они могут содержать только ссылки на объекты.

Вот пример, который использует переменные, чтобы прояснить функциональность:

Foo x = new Foo(); // Create a new instance of Foo and assign a reference to it to "x"
Foo y = x;         // Copy the reference (not the actual object) to "y"

// At this point, both x and y points to the same object
x.setValue(1);                    // Set the value to 1
y.setValue(2);                    // Set the value to 2
System.out.println(x.getValue()); // prints "2"

Теперь то же самое верно и для списков:

List<Foo> listA = new ArrayList<Foo>();
List<Foo> listB = new ArrayList<Foo>();
listA.add(new Foo());
listB.add(listA.get(0));

// The single instance of Foo is now in both lists
listB.get(0).setValue(1);
System.out.println(listA.get(0).getValue()); // Prints "1"
0 голосов
/ 15 августа 2011

Да, это изменится. В Java вы работаете со ссылками объектов. поэтому, когда вы помещаете объект в список, вы просто помещаете его ссылку в список. когда вы копируете его в другой список, вы просто копируете ссылку, а когда вы что-то меняете, вы используете ссылку, чтобы изменить исходный объект. поэтому ваш исходный объект был изменен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...