列表更改列表中的值

时间:2014-11-08 22:11:00

标签: java list

我对java列表感到困惑:

public static void testListValueChange() {
    List<Integer> t = new ArrayList<>();
    List<List<Integer>> tt = new ArrayList<List<Integer>>();
    int a = 1;
    t.add(a);
    tt.add(t);
    System.out.println(tt);
    t.add(2);
    System.out.println(tt);

}

为什么我的第二次打印[[1,2]]?我刚刚在res = [1]

时添加了res

2 个答案:

答案 0 :(得分:0)

tt有一个元素,指向t。修改t时,您还要修改tt的第一个(也是唯一的)元素。如您所见,t有两个值:1和2。

答案 1 :(得分:0)

那是因为List.add确实添加了指向对象(引用)的指针,并且不复制对象然后添加副本。这是Java在处理对象时的正常行为,当你使用原语时它会有所不同(这里它可以与copys一起使用,而不是使用指针/引用)。

在这里您可以看到相同的行为:

public class MyClass {
  int a;
}

public void a() {
  MyClass x = new MyClass(); // "x" is an object
  x.a = 1;
  b(x); // <- it calls method "b" with a reference/pointer to "MyClass x"
  System.out.println(x.a); // <- prints 2
}

public void b(MyClass x) {
  x.a = 2;
}

和原语:

public void a() {
  int x = 1; // "x" is a primitive
  b(x); // <- it calls method "b" with a copy of "int x"
  System.out.println(x); // <- prints 1
}

public void b(int x) {
  x = 2;
}