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

Java 如何将一个ArrayList的内容复制到另一个ArrayList中?,java,reference,variable-assignment,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

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

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();
ArrayList myObject=new ArrayList();
ArrayList myTempObject=新建ArrayList();
//在这里填充myTempObject
....
//使myObject包含与myTempObject相同的值
myObject=myTempObject;
//通过清除myTempObject释放内存
myTempObject.clear();
当然,现在的问题是
myObject
实际上只是指向
myTempObject
,所以一旦
myTempObject
被清除,
myObject
也被清除


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

您可以使用以下技巧:

myObject = new ArrayList<Object>(myTempObject);
myObject=新的ArrayList(myTempObject);
或使用

myObject = (ArrayList<Object>)myTempObject.clone();
myObject=(ArrayList)myTempObject.clone();
您可以获得有关clone()方法的一些信息


但是您应该记住,所有这些方法都会为您提供一份列表的副本,而不是它的所有元素。因此,如果更改复制列表中的一个元素,它也将在原始列表中更改。

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

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

这可以通过使用接受另一个
ArrayList
的构造函数创建一个新的
ArrayList
来实现:

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

编辑:正如波希米亚人在下面的评论中指出的,这就是你要问的吗?通过执行上述操作,
ArrayList
s(
myTempObject
myObject
)都将包含对相同对象的引用。如果您确实想要一个包含
myTempObject
中包含的对象的新副本的新列表,那么您需要在原始
ArrayList
中创建每个对象的副本。您需要
clone()
单个对象<代码>构造函数和其他方法执行浅复制。您可以尝试方法。

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

原始数组列表。addAll(copyArrayList)

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


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

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

如果说arraylist1=arraylist2,则两个列表都指向同一个位置,因此,如果更改其中一个,则数据将更改,因此两个列表始终保持不变

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

ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
以您当前使用的任何方式填写列表1

foreach(<type> obj in list1)
{
    list2.Add(obj);
}
foreach(列表1中的obj)
{
清单2.添加(obj);
}

建议将oldList复制到名为newList的新ArrayList对象中

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

for (int i = 0 ; i<oldList.size();i++){
    newList.add(oldList.get(i)) ;
}
ArrayList newList=new ArrayList();
对于(inti=0;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());
            }
ArrayList firstArrayList=新建ArrayList();
firstArrayList.添加(“一”);
firstArrayList.添加(“两个”);
firstArrayList.添加(“三”);
firstArrayList.添加(“四”);
firstArrayList.添加(“五”);
firstArrayList.添加(“六”);
//将数组列表内容复制到另一个数组列表中
ArrayList secondArrayList=新的ArrayList();
addAll(firstArrayList);
//打印数组列表的所有内容
迭代器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());
                }**
**ArrayListsecondArrayList=(ArrayList)firstArrayList.clone()**
然后使用迭代器进行打印
**迭代器itr=secondArrayList.Iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}**
将一个列表复制到第二个列表非常简单,您可以按如下方式执行:-

ArrayList list1=新的ArrayList();
ArrayList list2=新的ArrayList();
//这会将您的列表1复制到列表2中
列表2.addAll(列表1);

制作原始列表深度副本的简单方法是将一个列表中的所有元素添加到另一个列表中

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

for(Object o : originalList) {
    duplicateList.add(o);
}
ArrayList originalList=新的ArrayList();
ArrayList duplicateList=新的ArrayList();
for(对象o:原始列表){
重复列表。添加(o);
}

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

这里有一个解决方法,可以将所有对象从一个arrayList复制到另一个arrayList:

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

myObject.addAll(myTempObject.subList(0, myTempObject.size()));
ArrayList myObject=new ArrayList();
ArrayList myTempObject=新建ArrayList();
myObject.addAll(myTempObject.subList(0,myTempObject.size());

子列表用于返回包含一系列数据的列表。因此,您可以复制整个arrayList或其中的一部分。

假设您有两个字符串类型的arrayList。 像

ArrayList firstArrayList;//此数组列表没有任何数据。
ArrayList secondArrayList=新建ArrayList();//有一些数据。
现在我们必须像这样将第二个数组的数据复制到第一个arraylist

firstArrayList = new ArrayList<>(secondArrayList );
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);