CQM*_*CQM 77 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 myTempObject
myObject = myTempObject;
//free up memory by clearing myTempObject
myTempObject.clear();
Run Code Online (Sandbox Code Playgroud)
现在这个问题当然是myObject真的只是指向myTempObject,所以一旦myTempObject被清除,也是如此myObject.
如何从保留值myTempObject在myObject使用Java?
Art*_*tem 123
你可以使用这样的技巧:
myObject = new ArrayList<Object>(myTempObject);
Run Code Online (Sandbox Code Playgroud)
或使用
myObject = (ArrayList<Object>)myTempObject.clone();
Run Code Online (Sandbox Code Playgroud)
您可以在此处获取有关clone()方法的一些信息
但你应该记住,所有这些方法都会给你一份你的List,而不是它的所有元素.因此,如果您更改复制的列表中的某个元素,它也将在原始列表中更改.
Dha*_*y M 41
originalArrayList.addAll(copyArrayList);
请注意:使用addAll()方法进行复制时,两个数组列表(originalArrayList和copyArrayList)的内容都引用相同的对象或内容.因此,如果您修改其中任何一个,则另一个也将反映相同的更改.
如果你不想这样,那么你需要将每个元素从originalArrayList复制到copyArrayList,就像使用for或while循环一样.
Bri*_*ach 16
通过赋值运算符在java中没有隐式副本.变量包含一个引用值(指针),当你使用时,=你只需要处理该值.
为了保留myTempObject你的内容,你需要复制它.
这可以通过ArrayList使用另一个构造函数创建一个new来完成ArrayList:
ArrayList<Object> myObject = new ArrayList<Object>(myTempObject);
Run Code Online (Sandbox Code Playgroud)
编辑:波希米亚人在下面的评论中指出,这就是你要问的问题吗?通过执行上述操作,ArrayLists(myTempObject和myObject)都将包含对相同对象的引用.如果您确实想要一个包含当前所包含对象的新副本的新列表,myTempObject则需要复制原始对象中的每个对象ArrayList
小智 8
我自己也遇到了同样的问题.
说arraylist1 = arraylist2将它们设置为指向同一个地方,所以如果你改变了数据,那么两个列表总是保持不变.
要将值复制到独立列表中,我只使用foreach复制内容:
ArrayList list1 = new ArrayList();
ArrayList list2 = new ArrayList();
Run Code Online (Sandbox Code Playgroud)
以你现在的任何方式填写list1.
foreach(<type> obj in list1)
{
list2.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)
假设您要将 oldList 复制到名为 newList 的新 ArrayList 对象中
ArrayList<Object> newList = new ArrayList<>() ;
for (int i = 0 ; i<oldList.size();i++){
newList.add(oldList.get(i)) ;
}
Run Code Online (Sandbox Code Playgroud)
这两个列表是独立的,对一个的更改不会反映到另一个。