这是一个非常简短直接的问题,但我一直无法找到答案。 请考虑以下情况。
ArrayList<A> listOne, listTwo;
listOne = new ArrayList<A>();
listTwo = listOne;
我的问题是listTwo
会发生什么。从C“nativespeaker”的角度来看,只复制指针而不执行其他操作,或者列表是否复制到新的内存区域中。我对此代码的目标如下:
ArrayList<A> listOne, listTwo, auxList;
//listOne and listTwo have been initialized and filled somewhere else.
public void method( int opType ){
if( opType == 0)
auxList = listOne; //Set pointer, not copy list;
else
auxList = listTwo; //Set pointer, not copy list;
....
}
答案 0 :(得分:5)
[...]仅复制指针,不执行其他操作,或者是在新内存区域中复制的列表。
listOne
中包含的引用已复制到listTwo
。
列表未复制。周围只会有一个列表。
答案 1 :(得分:3)
是的,它只是对复制的List
对象的引用。从C的角度来看,这相当于这样做:
list *list_one, list_two;
list_one = malloc(sizeof(list));
list_two = list_one;
答案 2 :(得分:3)
只有一个清单。这可以通过以下事实看出:只有一个new
关键字创建了一个列表。 listOne
和listTwo
变量都指向同一个ArrayList
对象。
答案 3 :(得分:2)
listTwo将引用listOne,列表本身不会被复制。 如果要将listOne复制到新对象,可以使用clone()或复制构造函数。
答案 4 :(得分:2)
两个变量都将指向相同的列表对象,cf:
-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4000,suspend=n
输出:
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
true
[foo]
[foo]
true
[foo, bar]
[foo, bar]
运算符将返回==
。