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吗?
首先,数组不是原始类型;这是一个对象。其次,多维数组被实现为数组的数组。而且,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复制单个一维数组。