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

95

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

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,因此一旦清除了 myTempObjectmyObject 也会被清除。

如何在Java中保留从 myTempObjectmyObject 的值?


你可以使用 List.addAll。但是,如果你需要保留所有对象,那么清除临时列表并不能真正释放大量内存。因为你只是试图清除引用,而对于你想要保留的对象,你仍然在尝试保留它们。 - Bhesh Gurung
据我所知,这个答案仍然有效:https://dev59.com/kXRB5IYBdhLWcg3wHkPi - home
2
很难理解你真正想要实现什么。你需要解释清楚你的情况。 - Bhesh Gurung
13个回答

152

您可以使用这样的技巧:

myObject = new ArrayList<Object>(myTempObject);

或使用

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

您可以在这里获取有关clone()方法的一些信息。

但是请记住,所有这些方式都会给您一个List的副本,而不是它的所有元素。因此,如果您更改已复制的List中的一个元素,则原始List中的该元素也将更改。


7
在Java中,按值赋值是为原始类型(int、byte、char等)和字面量保留的方式。除非您明确告诉Java要复制来自“Object”的内容,否则它将始终按引用赋值。顺便说一下,“clone()”是浅复制,不会复制包含的“对象”,而是对它们的引用。如果您想进行深层复制,请参阅:https://dev59.com/SnVD5IYBdhLWcg3wKoWH - PeterT
@PeterT - Java仅支持按值调用和赋值。非原始类型变量包含被分配或传递的“引用值”。 - Brian Roach
为什么我不能执行 oldList = newList 操作? - X09
2
@X09 oldList = newList 会将 newList 的引用复制到 oldList,任何对 newList 的更改也会反映在 oldList 中。这不是预期的行为。 - Sreekanth Karumanaghat

44

originalArrayList.addAll(copyArrayList);

请注意:使用addAll()方法复制时,原始数组列表(originalArrayList)和副本数组列表(copyArrayList)的内容指向相同的对象或内容。因此,如果您修改其中任何一个,另一个也将反映相同的更改。

如果不想这样,那么您需要将originalArrayList中的每个元素复制到copyArrayList中,比如使用for或while循环。


1
如何停止影响另一个列表 我们还有其他方法可以处理这个问题吗? - Mahesh
@Mahesh - 请参考此链接:https://dev59.com/kXRB5IYBdhLWcg3wHkPi - KrishPrabakar

17
在Java中,赋值运算符不会进行隐式复制。变量包含引用值(指针),当使用=时,您只是复制了该值。
为了保留myTempObject的内容,您需要创建它的一个副本。
这可以通过使用另一个ArrayList作为参数的构造函数来完成:
ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);

编辑: 正如 Bohemian 在下面的评论中指出的那样,这是你想问的吗?通过上述方法,两个 ArrayListmyTempObjectmyObject)将包含对相同对象的引用。如果您实际上需要一个包含原始 ArrayList 中包含的对象的新列表的副本,则需要复制每个单独的对象。


1
在这种情况下,调用ArrayList上的clear()将不会对其中包含的对象产生影响,因此它可以正常工作。如果他想要列表中包含的对象的新副本,那就是另一回事了,但我认为这个问题并不是在问那个。 - Brian Roach
你知道吗,我认为你是对的。是我误解了问题。他担心清除一个会清除另一个。评论已删除。 - Bohemian
@Bohemian - 我认为这是一条公正的评论,我已经编辑了我的帖子来反映它。当阅读他的问题时,我没有考虑到这可能是OP的意图。 - Brian Roach
@BrianRoach 如何在 ArrayList 中复制另一个 ArrayList。 - Arun PS

8
我自己也遇到了同样的问题,发现可以这样解决。
说arraylist1 = arraylist2会让它们都指向同一个位置,因此如果你改变其中任意一个数据,另一个数据也会随之改变,两个列表始终保持一致。
要将值复制到一个独立的列表中,我只需使用foreach复制内容即可:
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();

以你目前的方式填充list1。

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

7
假设您想将oldList复制到一个名为newList的新ArrayList对象中。
ArrayList<Object> newList = new ArrayList<>() ;

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

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

oldList和newList仍然是相互依赖的。如果您从newList中删除一个元素,它也会从oldList中删除。您有测试过吗? - Michael

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() 单个对象。构造函数和其他方法执行浅复制。您可以尝试使用 Collections.copy 方法。

1
“Collections.copy”有问题。首先,它误导人们认为它会复制元素,但实际上它只是在新列表中引用它们。其次,你需要已经有一个目标列表,其大小不低于源列表... - ACV

1
直接复制原始列表的简单方法是将一个列表中的所有元素添加到另一个列表中。
ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();

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

现在,如果您对originalList进行任何更改,它都不会影响duplicateList。

这两个列表仍然会相互依赖。尝试在重复项上使用 remove 方法并打印原始列表。 - Michael

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接