Java 我对复制二维数组感到困惑

Java 我对复制二维数组感到困惑,java,multidimensional-array,Java,Multidimensional Array,我读了这篇关于堆栈溢出的文章:我对克隆方法在这里的工作原理有点困惑 public int[][] CopyMap(int[][] Map) { int [][] copy = new int[Map.length][]; for(int i = 0; i < Map.length; i++) copy[i] = Map[i].clone(); return copy; } 4) 还复制[i]?这是一个2D数组,所以它不应该是copy[i][?或者

我读了这篇关于堆栈溢出的文章:我对克隆方法在这里的工作原理有点困惑

public int[][] CopyMap(int[][] Map)
{
    int [][] copy = new int[Map.length][];
    for(int i = 0; i < Map.length; i++)
        copy[i] = Map[i].clone();
    return copy; 
}

4) 还
复制[i]
?这是一个2D数组,所以它不应该是
copy[i][
?或者类似的

在Java中,2D数组本质上是数组的数组(可能具有不同的长度)。记住这一点很重要。例如,这是确定的:

 int[][] ar = new int[2][];
 ar[0] = new int[8]; // ar[0][0..7]
 ar[1] = new int[4]; // ar[1][0..3]
语法
newint[8][10]
可以方便地创建8个单独的数组,每个数组包含10个元素

如果您熟悉C:Java中的
int[][]
更类似于C中的
int**

注意:
Map
是Java中变量的一个糟糕名称;变量名通常以小写字母开头,还有一个非常常见的同名基本容器接口

1) 为什么要将Map.length放在第一组方括号中,而不是Map[0]。int[][]copy=new int[Map.length][];,则将length放在第二组方括号中

因为我们从Map.length
int[]
数组开始,然后一次克隆一个

我们不也需要初始化列的长度吗

不,因为当我们在
Map
中遍历每个
int[]
时,我们只是使用
clone()
来复制它:
copy[i]=Map[i].clone()

通过一次克隆一列列并将其放入我们的2D数组,它为我们设置了列的长度

“列”只是您提出的一个概念,它仅与表格数据(特定上下文中的列主要表格数据)相关。不管怎样,“设置长度”并不准确,因为它意味着一开始就存在被设置长度的东西;但是当您执行
intx[][]=newx[5][]
时,
x[0]
null
,直到您将其分配给某个对象。通过一次克隆一个
int[]
s,我们只是。。。一次克隆一个。因此,是的,每个克隆将与原始克隆大小相同

3) 我们可以通过这样做来反转代码吗

public int[][] CopyMap(int[][] Map)
{
    int [][] copy = new int[][Map[0].length];
    for(int i = 0; i < Map[0].length; i++)
        copy[i] = Map[i].clone();
    return copy; 
}
public int[][] CopyMap(int[][] Map)
{
   int [][] copy = new int[][Map[0].length];
   for(int i = 0; i < Map[0].length; i++)
       copy[i] = Map[i].clone();
   return copy;
}
public int[]CopyMap(int[]Map)
{
int[][]复制=新int[][Map[0]。长度];
对于(int i=0;i
没有;希望原因现在清楚了,因为您知道
int[][]
是数组的数组。表达式
newint[][size]
没有多大意义;它说我们希望数组中的每个
int[]
都有一个给定的大小,但没有说数组中有多少
int[]
s。这是错误的,原因与
int[]x=new int[]错误的原因相同

4) 还
复制[i]
?这是一个2D数组,所以它不应该是
copy[i][
?或者类似的

不,它应该是
copy[i]
。我将把找出原因作为一项练习。

还将看看哪一项解释得很好。