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


85

我有一些数据结构,我想将其中一个用作临时结构,将另一个用作非临时结构。

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();

现在的问题当然是myObject实际上只是指向myTempObject,因此一旦myTempObject清除,也是如此myObject

如何myTempObjectmyObject使用Java时保留值?


您可以使用List.addAll。但是,如果您需要保留所有对象,那么清除临时列表实际上并不会清除大量内存。因为您只是尝试清除引用,所以您要尝试保留对象。
Bhesh Gurung 2011年

据我知道这个答案依然有效:stackoverflow.com/questions/715650/...

2
很难解释您真正想要实现的目标。您需要说明您的情况。
Bhesh Gurung 2011年

Answers:


138

您可以使用以下技巧:

myObject = new ArrayList<Object>(myTempObject);

或使用

myObject = (ArrayList<Object>)myTempObject.clone();

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

但是您应该记住,所有这些方式都会给您List的副本,而不是其所有元素。因此,如果您更改复制的列表中的元素之一,则它也将在原始列表中进行更改。


7
Java中的按值分配是保留给原始类型(int,byte,char等)和文字的内容。除非您明确告诉Java复制它派生的内容,Object否则它将始终通过引用进行分配。顺便说一句,clone()是浅表副本,将不会复制包含的内容Objects,而是对其进行引用。如果你想深复制看一看:stackoverflow.com/questions/64036/...
PeterT

@PeterT-Java按值调用并按值分配。非基本类型变量包含分配或传递的参考值
布莱恩·罗奇

请为什么我不能oldList = newList呢?
X09

2
@ X09 oldList = newList会将newList的引用复制到oldList,newList中的任何更改也将反映在oldList中。那不是预期的行为。
Sreekanth Karumanaghat

42

originalArrayList。addAll(copyArrayList);

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

如果您不希望这样做,则需要将每个元素从originalArrayList复制到copyArrayList,例如使用for或while循环。


1
如何停止对其他列表的影响,还有其他方法可以解决


17

没有通过赋值运算符在Java中创建隐式副本。变量包含一个参考值(指针),使用时=仅应对该值。

为了保留myTempObject您的内容,您需要对其进行复制。

这可以通过ArrayList使用需要另一个构造函数的构造函数来创建ArrayList

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

编辑:正如波希米亚在下面的评论中指出的那样,这是您要问的吗?通过执行上述操作,ArrayLists(myTempObjectmyObject)都将包含对相同对象的引用。如果您实际上想要一个新列表,其中包含其中包含的对象的新副本,myTempObject则您需要为原始对象中的每个对象创建一份副本ArrayList


1
在这种情况下,它会正常工作的调用clear()ArrayList myTempObject没有任何作用的对象包含therin。如果他想要列表中包含的对象的新副本,那就是另一回事了,但这不是我将这个问题解释为询问的内容。
Brian Roach

你知道我认为你是对的。误解了这个问题。他担心清除一个会清除另一个。评论已删除。
波希米亚

@Bohemian-我认为这是一个公平的评论,我编辑了帖子以反映出来。在阅读他的问题时,我不认为这可能是OP的意图。
布莱恩·罗奇

@BrianRoach如何在ArrayList内获取ArrayList的副本。
阿伦(Arun)2015年

8

自己面对同一问题时遇到了这个问题。

说arraylist1 = arraylist2会将它们都设置为指向同一位置,因此,如果您更改数据之一,则两个列表始终保持不变。

要将值复制到一个独立的列表中,我仅使用foreach复制内容:

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

以目前的方式填写list1。

foreach(<type> obj in list1)
{
    list2.Add(obj);
}

4

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

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

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}

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


4

让我们尝试这个例子

     ArrayList<String> firstArrayList = new ArrayList<>();
            firstArrayList.add("One");
            firstArrayList.add("Two");
            firstArrayList.add("Three");
            firstArrayList.add("Four");
            firstArrayList.add("Five");
            firstArrayList.add("Six");
            //copy array list content into another array list
             ArrayList<String> secondArrayList=new ArrayList<>();
            secondArrayList.addAll(firstArrayList);
            //print all the content of array list
            Iterator itr = secondArrayList.iterator();
            while (itr.hasNext()) {
                System.out.println(itr.next());
            }

在以下打印输出

一个
两个
三个
四个
五个
六个

我们也可以通过使用clone()方法来创建精确副本

为此尝试,您可以尝试像

 **ArrayList<String>secondArrayList = (ArrayList<String>) firstArrayList.clone();**
    And then print by using iterator
      **Iterator itr = secondArrayList.iterator();
                while (itr.hasNext()) {
                    System.out.println(itr.next());
                }**

3

您需要clone()单个对象。Constructor和其他方法执行浅表复制。您可以尝试 Collections.copy方法。


Collections.copy 被打破。首先,它说复制了元素,而仅在新列表中引用了它们,从而产生了误导。其次,您需要已经有一个大小不小于源列表的目标列表...
ACV

1

直接复制原始列表的简单方法是将一个列表中的所有元素添加到另一列表中。

ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

for(Object o : originalList) {
    duplicateList.add(o);
}

现在,如果您对originalList进行任何更改,则不会影响重复列表。


0

要将一个列表复制到另一个列表中,可以使用称为Collection.copy(myObject myTempObject)的方法。现在,在执行这些代码行之后,您可以看到myObject中的所有列表值。


0

将一个列表复制到第二个列表非常简单,您可以按照以下步骤操作:

ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);

0

这是一种将所有对象从一个arrayList复制到另一个的解决方法:

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

myObject.addAll(myTempObject.subList(0, myTempObject.size()));

subList旨在返回包含数据范围的List。因此您可以复制整个arrayList或其中的一部分。


0

假设您有两个String类型的arraylist。喜欢

ArrayList<String> firstArrayList ;//This array list is not having any data.

ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.

现在我们必须像这样将第二个数组的数据复制到第一个arraylist中,

firstArrayList = new ArrayList<>(secondArrayList );

做完了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.