Java数组拷贝问题
深拷贝和浅拷贝的定义就不赘述了,但是我们在写代码的时候有时会发现,即使使用的是深拷贝,结果却还是改变了同一个对象
这本质上的是Java的传递方式导致的,Java中是值传递
举两个例子
以下是一个Arrays.copyof()的浅拷贝
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] copyOf = Arrays.copyOf(a, 4);
a[0] = 2;
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(copyOf));
}
运行结果:
[2, 2, 3, 4]
[1, 2, 3, 4]
这是因为a中的元素是常量池中的内存地址,Arrays.copyOf(a, 4)是将a中每一个值(内存地址),拷贝过来,a[0] = 2是将常量池中2的内存地址赋值给a[0],显然没有影响到copyOf中0下标的值
这是一个for循环的拷贝的深拷贝
public static class P{
public String name;
public P(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "P{" +
"name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
P[] strings = {new P("zhang"), new P("li"), new P("wang")};
P[] s2 = new P[3];
for (int i = 0; i < strings.length; i++) {
s2[i] = strings[i];
}
strings[0].setName("gou");
System.out.println(Arrays.toString(strings));
System.out.println(Arrays.toString(s2));
}
运行结果:
[P{name='gou'}, P{name='li'}, P{name='wang'}]
[P{name='gou'}, P{name='li'}, P{name='wang'}]
这同样是应为for循环只是存的每个P对象的引用的值,而strings和s2中元素的内存地址都是一样的,故而修改了同一个对象