我可以使用另一个ArrayList中的引用更改一个ArrayList中的对象吗?

时间:2011-08-15 08:22:23

标签: java arraylist reference

第一个数组列表: - ArrayList<Object> list1;
第二个数组列表: - ArrayList<Object> list2;

假设我已经用list1填充了一些对象。 现在,我使用list1list2.add(list1[i])复制一些对象,并使用list2更改为list2[j].setA = something中的对象。

list1中对象的相应值A是否会发生变化? 实际上我希望更改值A

3 个答案:

答案 0 :(得分:9)

它会改变。列表仅包含对象*的引用。因此,在将list1中的一些元素添加到list2之后,这两个列表将共享对相同物理对象的引用。

* 在Java集合中,您不能存储基本类型,例如int,只能存储它们的对象(在这种情况下为Integer),始终通过引用。

答案 1 :(得分:1)

java.util.List(包括ArrayListLinkedList)包含对象的引用。也就是说,如果你有一个对象的实例并将该实例放在两个列表中,那么这两个列表将引用相同的实际对象。

事实上,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"

答案 2 :(得分:0)

是的,它会改变。在java中,您使用对象的引用。所以当你把一个对象放在一个列表中时,你只需将它的引用放在列表中。当您将其复制到另一个列表时,您只需复制引用,当您更改某些内容时,您正在使用引用来更改原始对象。所以原来的对象已被更改。