更新另一个时 Java 列表已更改

Vas*_*Doe 3 java

假设我们有:

public class Test {

    private List<String> mWorkList;
    private List<String> mOriginalList;

    public Test(List<String> list) {
        mWorkList = list;
        mOriginalList = list;
    }

    public void updateData(List<String> newList) {
        mWorkList.clear();
        mWorkList.addAll(newList);
    }
}
Run Code Online (Sandbox Code Playgroud)

我只想要改变mWorkList,但mOriginalList在变过,当我打电话updateData(List<String>)。那么我应该如何做才能保持mOriginalList在构造函数中最初分配的状态?

Zab*_*uza 5

在 Java 中,您通过引用传递变量。这意味着无论何时您进行赋值时mWorkList = list,变量mWorkList都将指向内存中当前指向的相同位置list。如果你这样做mOriginalList = list,那么mOriginalList也会指向那个位置。即所有三个列表在那个点引用同一个对象


如果你想要独立的列表,你需要将列表中的所有值复制到一个新列表中,如下所示:

List<String> myList = new ArrayList<>(otherList);
Run Code Online (Sandbox Code Playgroud)

这个构造函数会ArrayList自动添加另一个列表中的所有值,这里是它的文档


您的代码可能如下所示:

public Test(List<String> list) {
    mWorkList = new ArrayList<>(list);
    mOriginalList = new ArrayList<>(list);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您不打算更改,mOriginalList您也可以将其保留为mOriginalList = list. 但是请记住,如果用户对list(来自您班级之外的)进行了更改,它们也会反映在您的课程中mOriginalList,这很容易导致令人讨厌的错误