ArrayList操作

时间:2015-05-20 11:36:13

标签: java arraylist

这是一个非常简短直接的问题,但我一直无法找到答案。 请考虑以下情况。

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;

    ....
}

5 个答案:

答案 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关键字创建了一个列表。 listOnelistTwo变量都指向同一个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] 运算符将返回==