仅将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)方法中,您无法修改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(old) ,对象仍然在不应该的地方改变引用。 所以我必须在里面实例化一个新的对象副本。

我创建了一个类似于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()); }