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]