仅将ArrayList作为值传递而不是引用
简单地说,我有一个带有ArrayList参数的方法。 在方法中,我修改ArrayList的内容,仅用于与方法返回的内容相关的目的。 因此,我不希望作为参数传递的ArrayList完全受到影响(即不作为引用传递)。
我尝试的一切都未能达到预期的效果。 我需要做什么才能在方法中使用ArrayList的副本,但不能更改实际变量?
即使你有办法将数组列表作为副本传递而不是通过引用,它也只是一个浅的副本。
我会做的事情如下:
void foo(final ArrayList list) { ArrayList listCopy = new ArrayList(list); // Rest of the code }
只需处理复制的列表即可。
您可以使用ArrayList的复制构造函数创建ArrayList的副本:
ArrayList copy = new ArrayList(original);
但是,如果列表的元素也是对象,那么您必须意识到修改副本的成员也将修改原始成员。
您可以传递Collections#unmodifiableList(yourList)
以发送列表的不可修改的副本。 顺便说一下,由于Java始终按值传递,因此List
按值传递 ,请注意在foo(List
方法中,您无法修改list
值,但可以修改其内容 。
public class MyClass { List list = new ArrayList (); public void bar() { //filling list... foo(Collections.unmodifiableList(list)); } public void foo(List list) { //do what you want with list except modifying it... } }
您可以使用.clone
方法或CopyOnWriteArrayList
进行复制,从而不会影响原始文件。
在你的方法中尝试这个:
void method(List list) { List copyList = new ArrayList (); copyList.addAll(list); // This will create a copy of all the emlements of your original list }
我不确定为什么,即使在new ArrayList
,对象仍然在不应该的地方改变引用。 所以我必须在里面实例化一个新的对象副本。
我创建了一个类似于ArrayList上的复制构造函数,并且确实喜欢
newArray = new ArrayList(); for (int i = 0; i < oldArray.size(); i++) { newArray.add(new MyObj(ondArray.get(i))); }
只是希望能帮助别人,如果Avi的答案在你的情况下是不够的,就像我的代码太乱了甚至不能理解= P
只是克隆它。
public ArrayList cloneArrayList(ArrayList lst){ ArrayList list = new ArrayList(); for (int i=0; i
在评论中添加建议,您也可以使用
ArrayList copy = new ArrayList(original);
并且
ArrayList copy = new ArrayList(); copy.addAll(original);
在现有答案的行上但使用ArrayList API。 您可以使用subList(fromIndex, toIndex)
方法。 它显式创建了一个只包含所需元素的列表视图(当然,按顺序)。 在这里,即使您使用添加/删除等操作修改视图,它也不会更改原始列表。 它可以避免显式创建副本。
像这样的东西:
public void recursiveMethod(List list) { if(base) return; recursiveCall(list); // following will just create a tail list but will not actually modify the list recursiveCall(list.subList(1, list.size()); }