【问题标题】:How do I copy the contents of one ArrayList into another?如何将一个 ArrayList 的内容复制到另一个?
【发布时间】:2012-01-16 12:28:14
【问题描述】:

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

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 的值?

【问题讨论】:

  • 您可以使用List.addAll。但是,如果您需要保留所有对象,那么清除临时列表并不会真正清除大量内存。因为您只是想清除引用,就您试图保留它们的对象而言。
  • 据我所知,这个答案仍然有效:stackoverflow.com/questions/715650/…
  • 很难解释您真正想要实现的目标。你需要说明你的情况。

标签: java reference variable-assignment


【解决方案1】:

最简单的方法是:

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

【讨论】:

    【解决方案2】:

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

    ArrayList<String> firstArrayList ;//This array list is not having any data.
    
    ArrayList<String> secondArrayList = new ArrayList<>();//Having some data.
    

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

    firstArrayList = new ArrayList<>(secondArrayList );
    

    完成!!

    【讨论】:

      【解决方案3】:

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

       ArrayList<Object> myObject = new ArrayList<Object>();
      ArrayList<Object> myTempObject = new ArrayList<Object>();
      
      myObject.addAll(myTempObject.subList(0, myTempObject.size()));
      

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

      【讨论】:

        【解决方案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());
                        }**
        

        【讨论】:

          【解决方案5】:

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

          ArrayList<Object> originalList = new ArrayList<Object>();
          ArrayList<Object> duplicateList = new ArrayList<Object>();
          
          for(Object o : originalList) {
              duplicateList.add(o);
          }
          

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

          【讨论】:

          • 这两个列表仍然是相关的。尝试对副本使用删除方法并打印原件。
          【解决方案6】:

          将一个列表复制到第二个非常简单,您可以这样做:-

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

          【讨论】:

            【解决方案7】:

            你可以使用这样的技巧:

            myObject = new ArrayList<Object>(myTempObject);
            

            或使用

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

            你可以得到一些关于clone()方法here的信息

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

            【讨论】:

            • Java 中的按值赋值是为原始类型(int、byte、char 等)和文字保留的东西。除非您明确告诉 Java 复制从 Object 派生的内容,否则它将始终通过引用分配。顺便说一句,clone() 是浅拷贝,不会复制包含的Objects,而是对它们的引用。如果您想进行深度复制,请查看:stackoverflow.com/questions/64036/…
            • @PeterT - Java 调用和赋值。非原始类型变量包含分配或传递的引用值
            • 请问我为什么不能oldList = newList
            • @X09 oldList = newList 会将 newList 的引用复制到 oldList,newList 中的任何更改也将反映在 oldList 中。这不是预期的行为。
            【解决方案8】:

            假设您想将 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 中删除它。你甚至测试过这个吗?
            【解决方案9】:

            originalArrayList.addAll(copyArrayList);

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

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

            【讨论】:

            【解决方案10】:

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

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

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

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

            用你目前的任何方式填写list1。

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

                在 java 中没有通过赋值运算符创建的隐式副本。变量包含一个参考值(指针),当您使用 = 时,您只是在处理该值。

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

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

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

                编辑:正如 Bohemian 在下面的 cmets 中指出的那样,这就是您要问的吗?通过执行上述操作,ArrayLists(myTempObjectmyObject)都将包含对 same 对象的引用。如果您确实想要一个包含 myTempObject 中包含的对象的新副本的新列表,那么您需要为原始 ArrayList 中的每个单独对象制作一个副本

                【讨论】:

                • 在这种情况下,它可以正常工作,因为在 ArrayList 上调用 clear() myTempObject 不会影响其中包含的对象。如果他想要列表中包含的对象的新副本,那就另当别论了,但这不是我解释这个问题所要问的。
                • 你知道我认为你是对的。 误解了这个问题。他担心清除一个会清除另一个。评论已删除。
                • @Bohemian - 我认为这是一个公平的评论,我编辑了我的帖子以反映它。在阅读他的问题时,我认为这可能不是 OP 的意图。
                • @BrianRoach 如何在 ArrayList 中获取 ArrayList 的副本。
                【解决方案13】:

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

                【讨论】:

                • Collections.copy 坏了。首先,说它复制元素是一种误导,而它只在新列表中引用它们。其次,您需要已经有一个大小不小于源列表的目标列表...
                猜你喜欢
                • 2014-06-15
                • 1970-01-01
                • 2017-12-30
                • 2010-09-18
                • 2017-11-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多