这个问题在这里已经有答案了:
如何在java中对2d数组进行深度复制(7个答案)
一年前关门了。
我对java还比较陌生,我刚刚学到这个
import java.util.Arrays;
public class Foo {
private int[][] foo;
public Foo(int[][] arr) {
this.foo = arr;
}
@Override
public String toString() {
return Arrays.deepToString(this.foo).replace("],", "],\n");
}
public static void main(String[] args) {
int[][] p = { { 0, 0 }, { 0, 0 } };
Foo g = new Foo(p.clone()); // doesn't work with p nor p.clone()
System.out.println(g);
p[0][0] = 1;
System.out.println(g);
}
}
在这里,我创建了一个引用了另一个对象的对象,我可以从外部修改这个对象,因为我有一个引用,这个引用是作为参数传递给构造函数的。
虽然我理解为什么会这样,但我觉得这似乎违反了直觉。如果我将某个东西保存为对象的属性,我希望该对象有一个外部无法访问的“私有”副本。
我试着 .clone()
却无法解决。所以问题是。。。
这通常是怎么做的?我需要写一些吗 for
在构造函数中循环以获取参数中的每个值?
(或者这不是问题?)
这个问题的最后一部分很重要,也许这是一个非问题。或者人们会做一些“事情”(一些循环来获得一个深度克隆)?
1条答案
按热度按时间w1e3prcc1#
这里的问题是java并没有真正的二维数组。这是:
是int数组的数组。它不是一个2d int数组,当然一个int数组的数组确实感觉很像2d数组。对于大多数意图和目的,它是一个2dint数组,除非它不是,而对于clone,它不是。这个
clone()
数组的impl生成一个新数组,并将每个值逐字复制到新数组中。这意味着您的int数组是克隆的,但内部int数组不是。治疗时
int[][]
“这是一个二维数组”,是的,这是不直观的。治疗时int[][]
作为“int数组的数组”,这是非常直观的。在克隆时,您也不会期望一个arraylist数组同时克隆每个单独的arraylist。苏。。如何深度克隆数组?了解如何在java中对2d数组进行深度复制吗?有很多选择:)