繁体   English   中英

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

[英]How do I copy the contents of one ArrayList into another?

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

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也是如此。

如何使用 java 在myObject保留来自myTempObject的值?

你可以使用这样的技巧:

myObject = new ArrayList<Object>(myTempObject);

或使用

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

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

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

原始数组列表。 addAll (copyArrayList);

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

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

java中没有通过赋值运算符进行隐式复制。 变量包含一个引用值(指针),当您使用=您只是在处理该值。

为了保留myTempObject的内容,您需要复制它。

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

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

编辑:正如波西米亚人在下面的评论中指出的那样,这就是你要问的吗? 通过执行上述操作,两个ArrayList s( myTempObjectmyObject )都将包含对相同对象的引用。 如果您确实想要一个包含myTempObject中包含的对象的新副本的新列表,那么您需要制作原始ArrayList中每个单独对象的副本

在我自己面临同样的问题时遇到了这个问题。

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

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

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

以您目前的任何方式填写 list1。

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

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

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

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

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

让我们试试这个例子

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

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

对原始列表进行深度复制的直接方法是将一个列表中的所有元素添加到另一个列表中。

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

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

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

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

将一个列表复制到第二个非常简单,您可以按如下方式进行:-

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

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

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

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

subList 旨在返回一个包含一系列数据的列表。 所以你可以复制整个 arrayList 或它的一部分。

假设您有两个 String 类型的数组列表。 喜欢

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

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

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

firstArrayList = new ArrayList<>(secondArrayList );

完毕!!

最简单的方法是:

ArrayList<Object> myObject = new ArrayList<Object>();
// fill up data here
ArrayList<Object> myTempObject = new ArrayList(myObject);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM