如何将一个ArrayList的内容复制到另一个?

CQM*_*CQM 77 java reference variable-assignment

我有一些数据结构,我想使用一个作为临时,另一个不是临时的.

ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();


//fill myTempObject here
....

//make myObject contain the same values as myTempObject
myObject = myTempObject;

//free up memory by clearing myTempObject
myTempObject.clear();
Run Code Online (Sandbox Code Playgroud)

现在这个问题当然是myObject真的只是指向myTempObject,所以一旦myTempObject被清除,也是如此myObject.

如何从保留值myTempObjectmyObject使用Java?

Art*_*tem 123

你可以使用这样的技巧:

myObject = new ArrayList<Object>(myTempObject);
Run Code Online (Sandbox Code Playgroud)

或使用

myObject = (ArrayList<Object>)myTempObject.clone();
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取有关clone()方法的一些信息

但你应该记住,所有这些方法都会给你一份你的List,而不是它的所有元素.因此,如果您更改复制的列表中的某个元素,它也将在原始列表中更改.

  • 在Java中按值分配是为原始类型(int,byte,char等)和文字保留的东西.除非您明确告诉Java复制从"Object"派生的内容,否则它将始终通过引用进行分配.顺便说一句`clone()`是一个浅拷贝,不会复制包含的`Objects`,而是复制它们.如果您想制作一份深层副本,请查看:http://stackoverflow.com/questions/64036/how-do-you-make-a-deep-copy-of-an-object-in-java (6认同)
  • @X09 oldList = newList 会将 newList 的引用复制到 oldList,newList 中的任何更改也将反映在 oldList 中。这不是预期的行为。 (2认同)

Dha*_*y M 41

originalArrayList.addAll(copyArrayList);

请注意:使用addAll()方法进行复制时,两个数组列表(originalArrayList和copyArrayList)的内容都引用相同的对象或内容.因此,如果您修改其中任何一个,则另一个也将反映相同的更改.

如果你不想这样,那么你需要将每个元素从originalArrayList复制到copyArrayList,就像使用for或while循环一样.


Bri*_*ach 16

通过赋值运算符在java中没有隐式副本.变量包含一个引用值(指针),当你使用时,=你只需要处理该值.

为了保留myTempObject你的内容,你需要复制它.

这可以通过ArrayList使用另一个构造函数创建一个new来完成ArrayList:

ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Run Code Online (Sandbox Code Playgroud)

编辑:波希米亚人在下面的评论中指出,这就是你要问的问题吗?通过执行上述操作,ArrayLists(myTempObjectmyObject)都将包含对相同对象的引用.如果您确实想要一个包含当前所包含对象的新副本的新列表,myTempObject则需要复制原始对象中的每个对象ArrayList


小智 8

我自己也遇到了同样的问题.

说arraylist1 = arraylist2将它们设置为指向同一个地方,所以如果你改变了数据,那么两个列表总是保持不变.

要将值复制到独立列表中,我只使用foreach复制内容:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

以你现在的任何方式填写list1.

foreach(<type> obj in list1)
{
    list2.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)


Jav*_*ain 6

假设您要将 oldList 复制到名为 newList 的新 ArrayList 对象中

ArrayList<Object> newList = new ArrayList<>() ;

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}
Run Code Online (Sandbox Code Playgroud)

这两个列表是独立的,对一个的更改不会反映到另一个。