仅将ArrayList作为值传递而不是引用

fvg*_*vgs 30 java reference arraylist pass-by-reference

简单地说,我有一个带有ArrayList参数的方法.在方法中,我修改ArrayList的内容,仅用于与方法返回的内容相关的目的.因此,我不希望作为参数传递的ArrayList完全受到影响(即不作为引用传递).

我尝试的一切都未能达到预期的效果.我需要做什么才能在方法中使用ArrayList的副本,但不能更改实际变量?

Avi*_*Avi 44

即使你有办法将数组列表作为副本传递而不是通过引用,它也只是一个浅拷贝.

我会做的事情如下:

void foo(final ArrayList list) {

    ArrayList listCopy = new ArrayList(list);
    // Rest of the code

}
Run Code Online (Sandbox Code Playgroud)

只需处理复制的列表.


bch*_*iej 18

您可以使用ArrayList的复制构造函数创建ArrayList的副本:

ArrayList copy = new ArrayList(original);
Run Code Online (Sandbox Code Playgroud)

但是,如果列表的元素也是对象,那么您必须意识到修改副本的成员也将修改原始成员.

  • 您如何做到这一点,以便修改副本的成员不会修改原始列表? (2认同)

Lui*_*oza 5

您可以通过Collections#unmodifiableList(yourList)以发送列表的不可修改副本。顺便说一下,List<Whatever>由于Java总是按值传递,因此您是按值传递的,请注意,在foo(List<Whatever> list)方法中您不能修改该list值,但可以修改其内容

public class MyClass {

    List<Whatever> list = new ArrayList<Whatever>();

    public void bar() {
        //filling list...
        foo(Collections.unmodifiableList(list));
    }

    public void foo(List<Whatever> list) {
        //do what you want with list except modifying it...
    }
}
Run Code Online (Sandbox Code Playgroud)