Java: int[][] 是原始类型吗?或者它是否使用 clone() 方法生成不同的实例?

Java: Is int[][] a primitive type? Or does it generate a different instance with clone() method?

我正在使用 int[n][n] 开发板:

0 2 3 
4 1 5 
7 8 6 

我想制作一个名为 twin 的副本,然后 return 修改后的副本。

例如:

    int [][] twin = board.clone();

    twin[0][0] = board[0][1];
    twin[0][1] = board[0][0];

    return twin;

我的预期是:

//board
0 2 3 
4 1 5 
7 8 6 

//twin
2 0 3 
4 1 5 
7 8 6 

但结果是:

//board
2 2 3 
4 1 5 
7 8 6 

//twin
2 2 3 
4 1 5 
7 8 6 

板和双胞胎一直都是一样的,克隆没有按预期工作。是不是因为int[][]不是对象?

有没有办法克隆 int[][] 并修改我期望的方式?我应该遍历板并将值复制到双胞胎吗?

首先,数组不是原始类型;它是一个对象。其次,多维数组被实现为数组的数组。此外,数组的 clone 方法很浅。当你 clone 一个多维数组时,你的新多维数组仍然引用原来的内部数组。

board -> [ .           .           . ]
           |           |           |
           v           v           v
          [0, 2, 3], [4, 1, 5], [7, 8, 6]
           ^           ^           ^
           |           |           |
 twin -> [ .           .           . ]

因此,当您修改值时,您不是从两个不同的数组中复制,而是从同一个数组中复制,这就是为什么您会得到 [2, 2, 3]。

如果您要克隆多维数组,您还需要一直克隆到一维数组。

int [][] twin = board.clone();
for (int i = 0; i < board.length; i++) {
    twin[i] = board[i].clone();
}

现在我得到 [[2, 0, 3], [4, 1, 5], [7, 8, 6]].

其他可能性包括在不克隆的情况下声明新的多维数组,以及使用循环和 System.arraycopy 复制单个一维数组。

引用 JLS Chapter 10. Arrays:

In the Java programming language, arrays are objects

int[][] 不是原语。


引用 JLS 10.7. Array Members:

A clone of a multidimensional array is shallow, which is to say that it creates only a single new array. Subarrays are shared.

外层数组是一个新实例,子数组不是。