Java:int [] []是原始类型吗?还是使用clone()方法生成另一个实例?

Bel*_*len 2 java int clone primitive-types

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

0 2 3 
4 1 5 
7 8 6 
Run Code Online (Sandbox Code Playgroud)

我想制作一个称为twin的副本,然后返回修改后的副本。

例如:

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

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

    return twin;
Run Code Online (Sandbox Code Playgroud)

我所期望的是:

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

//twin
2 0 3 
4 1 5 
7 8 6 
Run Code Online (Sandbox Code Playgroud)

但是结果是:

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

//twin
2 2 3 
4 1 5 
7 8 6 
Run Code Online (Sandbox Code Playgroud)

董事会和双胞胎一直都是一样的,克隆无法正常工作。是否因为int [] []不是对象?

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

rge*_*man 6

首先,数组不是原始类型;这是一个对象。其次,多维数组被实现为数组的数组。而且,clone用于阵列的方法是浅的。当您clone使用多维数组时,新的多维数组仍然引用原始的内部数组。

board -> [ .           .           . ]
           |           |           |
           v           v           v
          [0, 2, 3], [4, 1, 5], [7, 8, 6]
           ^           ^           ^
           |           |           |
 twin -> [ .           .           . ]
Run Code Online (Sandbox Code Playgroud)

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

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

int [][] twin = board.clone();
for (int i = 0; i < board.length; i++) {
    twin[i] = board[i].clone();
}
Run Code Online (Sandbox Code Playgroud)

现在我明白了[[2, 0, 3], [4, 1, 5], [7, 8, 6]]

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