为什么一个arraylist在修改它的副本时会改变

Mer*_*ary 3 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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我试着打印它:

[2, 3]asd[2, 3]
Run Code Online (Sandbox Code Playgroud)

当我改变时,为什么j会改变?虽然不是原始的!

rge*_*man 8

该语句j=i;将引用指定为与引用j相同的引用i.现在,这两个ij指向同一个ArrayList对象.通过两个引用都可以看到删除第0个索引.

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

j = new ArrayList<Integer>(i);
Run Code Online (Sandbox Code Playgroud)

(这是一个浅层副本,因此列表仍然引用相同的元素.)

  • @meskobalazs Java中的所有内容都是按值传递的.对于对象,传递引用,但仍然按值传递. (3认同)