我对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]
答案 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;
}