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"