Java 将一维阵列复制到二维阵列

Java 将一维阵列复制到二维阵列,java,Java,使用C/C++可以执行以下操作: int arr[100]; int ar[10][10]; memcpy(ar, arr, sizeof(int)*100); 因为C/C++标准保证数组是连续的,所以上面的代码会将1D数组复制到2D数组 这在Java中是可能的吗?这在Java中是不可能的,因为Java中的多维数组实际上是数组的数组。这些元素不存储在连续的内存块中。您需要逐行复制元素 例如,以下是几种可能的技术之一: int arr[100] = . . .; int ar[10][10] =

使用C/C++可以执行以下操作:

int arr[100];
int ar[10][10];
memcpy(ar, arr, sizeof(int)*100);
因为C/C++标准保证数组是连续的,所以上面的代码会将1D数组复制到2D数组


这在Java中是可能的吗?

这在Java中是不可能的,因为Java中的多维数组实际上是数组的数组。这些元素不存储在连续的内存块中。您需要逐行复制元素

例如,以下是几种可能的技术之一:

int arr[100] = . . .;
int ar[10][10] = new int[10][10];
int offset = 0;
for (int[] row : ar) {
    System.arraycopy(arr, offset, row, 0, row.length);
    offset += row.length;
}
下面是计算数组创建表达式
new int[10][10]
时发生的步骤(请特别注意最后一点):

  • 首先,从左到右计算尺寸表达式。如果任何表达式计算突然完成,则不会计算其右侧的表达式

  • 接下来,将检查标注表达式的值。如果任何DimExpr表达式的值小于零,则抛出NegativeArraySizeException

  • 接下来,为新阵列分配空间。如果没有足够的空间分配数组,数组创建表达式的计算将通过抛出OutOfMemoryError突然完成

  • 然后,如果出现单二聚体,则创建指定长度的一维数组,并将数组的每个组件初始化为其默认值(§4.12.5)

  • 否则,如果出现n个DimExpr表达式,那么数组创建将有效地执行一组深度为n-1的嵌套循环,以创建隐含的数组数组


不,你必须循环。如果有什么区别的话,java保证100是连续的,但10x10不是。Java的int[][]实际上是c的int**,而不是int[][]。你试过Java.lang.System.arraycopy吗?对于Java7,您可以使用
Java.util.Arrays.copyOfRange(…)
,而不是
System.arraycopy
。这不会创建多维数组,但可以在循环中使用。可以查看
java.lang.reflect.Array
如何创建多维数组。然后以某种方式索引每个维度。