Java ArrayList操作
这是一个非常简短而直接的问题,但我还没有找到答案。 考虑下面的情况。Java ArrayList操作,java,arraylist,Java,Arraylist,这是一个非常简短而直接的问题,但我还没有找到答案。 考虑下面的情况。 ArrayList<A> listOne, listTwo; listOne = new ArrayList<A>(); listTwo = listOne; […]是只复制指针而不执行其他操作,或者是在新内存区域中复制列表 listOne中包含的引用被复制到listwo中 该列表不会被复制。周围只有一个列表。是的,它只是复制的列表对象的引用。从C的角度来看,这相当于这样做: list *list_o
ArrayList<A> listOne, listTwo;
listOne = new ArrayList<A>();
listTwo = listOne;
[…]是只复制指针而不执行其他操作,或者是在新内存区域中复制列表
listOne
中包含的引用被复制到listwo
中
该列表不会被复制。周围只有一个列表。是的,它只是复制的
列表
对象的引用。从C的角度来看,这相当于这样做:
list *list_one, list_two;
list_one = malloc(sizeof(list));
list_two = list_one;
只有一个列表。这可以通过以下事实看出:创建列表时只有一个
new
关键字。listOne
和listwo
变量都指向相同的ArrayList
对象。listwo将引用listOne,列表本身不会被复制。
如果要将listOne复制到新对象,可以使用clone()或复制构造函数 两个变量将指向同一个列表对象,cf:
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> listOne, listTwo;
listOne = new ArrayList<String>();
listTwo = listOne;
System.out.println(listOne == listTwo);
listOne.add("foo");
System.out.println(listOne == listTwo);
System.out.println(listOne);
System.out.println(listTwo);
listTwo.add("bar");
System.out.println(listOne == listTwo);
System.out.println(listOne);
System.out.println(listTwo);
}
}
注意,在java中,
=
操作符返回true
,如果双方都引用同一个对象。但是当您更改listone时会发生什么?清单二也会改变吗?不要这样认为……@MaVRoSCy,不,如果更改listOne
(即在该变量中存储另一个引用),则存储在listwo
中的值不会发生任何变化。如果更改listOne
引用的列表,那么listwo
引用的列表也会更改(因为它们引用相同的列表)。请注意方法中的代码片段可以方便地表示为auxList=opType==0?列表一:列表二代码>。这种变化会以可感知的方式影响性能吗?不会。但它不太容易出错,因为很明显,auxList
是在不考虑条件的情况下分配的。
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> listOne, listTwo;
listOne = new ArrayList<String>();
listTwo = listOne;
System.out.println(listOne == listTwo);
listOne.add("foo");
System.out.println(listOne == listTwo);
System.out.println(listOne);
System.out.println(listTwo);
listTwo.add("bar");
System.out.println(listOne == listTwo);
System.out.println(listOne);
System.out.println(listTwo);
}
}
true
true
[foo]
[foo]
true
[foo, bar]
[foo, bar]