我有一些数据结构,我想使用一个作为临时数据,另一个不是临时数据。
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保留myTempObject
myObject
中的值?
答案 0 :(得分:121)
你可以使用这样的技巧:
myObject = new ArrayList<Object>(myTempObject);
或使用
myObject = (ArrayList<Object>)myTempObject.clone();
您可以获取有关clone()方法here
的一些信息但你应该记住,所有这些方法都会为你提供列表的副本,而不是它的所有元素。因此,如果您更改复制的列表中的某个元素,它也将在原始列表中更改。
答案 1 :(得分:37)
originalArrayList的的addAll 强>(copyArrayList);
请注意:使用addAll()方法进行复制时,两个数组列表(originalArrayList和copyArrayList)的内容都引用相同的对象或内容。因此,如果您修改其中任何一个,则另一个也将反映相同的更改。
如果你不这样做,那么你需要将originalArrayList中的每个元素复制到copyArrayList,就像使用for或while循环一样。
答案 2 :(得分:16)
通过赋值运算符在java中没有隐式副本。变量包含一个引用值(指针),当你使用=
时,你只需要处理该值。
为了保留myTempObject
的内容,您需要复制它。
这可以通过使用另一个ArrayList
的构造函数创建一个新的ArrayList
来完成:
ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
编辑:正如波希米亚人在下面的评论中指出的那样,这就是你要问的问题吗?通过执行上述操作,ArrayList
s(myTempObject
和myObject
)都将包含对相同对象的引用。如果您确实想要一个包含myTempObject
中包含的对象的新副本的新列表,那么您需要复制原始ArrayList
答案 3 :(得分:7)
在遇到同样问题的同时遇到了这个问题。
说arraylist1 = arraylist2将它们设置为指向同一个地方,所以如果你改变了数据,那么两个列表总是保持不变。
要将值复制到独立列表中,我只使用foreach复制内容:
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
以您目前的任何方式填写list1。
foreach(<type> obj in list1)
{
list2.Add(obj);
}
答案 4 :(得分:4)
首先,您希望将oldList复制到名为newList
的新ArrayList对象中ArrayList<Object> newList = new ArrayList<>() ;
for (int i = 0 ; i<oldList.size();i++){
newList.add(oldList.get(i)) ;
}
这两个列表是独立的,对一个的更改不会反映到另一个列表中。
答案 5 :(得分: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());
}**
答案 6 :(得分:3)
您需要clone()
单个对象。 Constructor
和其他方法执行浅拷贝。您可以尝试Collections.copy方法。
答案 7 :(得分:1)
直接复制原始列表的方法是将所有元素从一个列表添加到另一个列表。
ArrayList<Object> originalList = new ArrayList<Object>();
ArrayList<Object> duplicateList = new ArrayList<Object>();
for(Object o : originalList) {
duplicateList.add(o);
}
现在如果对originalList进行任何更改,它将不会影响duplicateList。
答案 8 :(得分:0)
将一个列表复制到另一个列表中,您可以使用调用的方法 Collection.copy(myObject myTempObject)。现在执行这些代码后,你可以看到myObject中的所有列表值。
答案 9 :(得分:0)
将一个列表复制到第二个非常简单,您可以按照以下方式执行: -
ArrayList<List1> list1= new ArrayList<>();
ArrayList<List1> list2= new ArrayList<>();
//this will your copy your list1 into list2
list2.addAll(list1);
答案 10 :(得分:0)
这是将所有对象从一个arrayList复制到另一个的解决方法:
ArrayList<Object> myObject = new ArrayList<Object>();
ArrayList<Object> myTempObject = new ArrayList<Object>();
myObject.addAll(myTempObject.subList(0, myTempObject.size()));
subList旨在返回具有一系列数据的List。因此您可以复制整个arrayList或其中的一部分。
答案 11 :(得分: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 );
完成!
答案 12 :(得分:0)
最简单的方法是:
ArrayList<Object> myObject = new ArrayList<Object>();
// fill up data here
ArrayList<Object> myTempObject = new ArrayList(myObject);