java - 为什么一个 arraylist 的副本被修改时会发生变化

标签 java

这可能是一个非常简单的问题,但它仍然让我感到困惑!

import java.util.ArrayList;

public class Sample {
    ArrayList<Integer> i = new ArrayList<>();
    ArrayList<Integer> j = new ArrayList<>();

    /**
     * @param args
     */
    public static void main(String[] args) {
        new Sample().go();
    }

    private void go() {

        i.add(1);
        i.add(2);
        i.add(3);

        j=i;

        i.remove(0);


        System.out.println(i + "asd" + j);
    }

}

我试着打印它:

[2, 3]asd[2, 3]

为什么 i 改变时 j 也会改变?但是不会发生在原语上!

最佳答案

语句j=i; 将引用j 指定为与​​i 相同的引用。现在 ij 都引用同一个 ArrayList 对象。通过两个引用可以简单地看到第 0 个索引的删除。

如果您希望删除 i 中的项目不影响 j 中的列表,则创建列表的副本,而不是分配引用:

j = new ArrayList<Integer>(i);

(这是一个浅拷贝,所以列表仍然引用相同的元素。)

关于java - 为什么一个 arraylist 的副本被修改时会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19572953/

相关文章:

java - 使用Android Studio遇到错误

java.lang.NoClassDefFoundError : com/sun/istack/localization/Localizable? 错误

java - BufferedReader.ready() 方法是否确保 readLine() 方法不返回 NULL?

java - jframe中出现"Squared"个字符

Java 和 RegEx ..如何应用

java - 如果 @RequestBody 中不存在,则 boolean 设置为 false

java - jar 文件位置 - Ear 文件还是服务器 lib 文件夹?

java - 我的 switch 语句有什么问题?

java - 破解哈希算法

java - 在 Java 中缓冲 inputStream 时出现奇怪的 IOException