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.
外层数组是一个新实例,子数组不是。
我正在使用 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.
外层数组是一个新实例,子数组不是。