int[] reusable = new int[8];
int[] data = {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int[][] bytes = new int[data.length/8][];
for (int i = 0; i < data.length/8; i++) {
for (int i2 = 0; i2 < 8; i2++) {
reusable[i2] = data[i*8 + i2];
}
bytes[i] = reusable;
System.out.println(i);
System.out.println(Arrays.toString(reusable));
System.out.println(Arrays.deepToString(bytes));
}
这是我正在使用的一些代码。您可以运行它here。
当我们运行它时,我们可以看到2D数组bytes[][]
内的所有数组都更改为匹配数组reusable[]
,即使我们只将bytes[i]
设置为等于{ {1}}。
为什么reusable[]
中的所有数组都等于bytes[][]
而不只是reusable[]
等于bytes[i]
?
答案 0 :(得分:1)
那是因为您没有分配新的reusable
数组。实际上,你选择的名字背叛了这样一个事实:你认为它是可重用的,但事实上并非如此。
此声明:bytes[i] = reusable;
不会神奇地制作reusable
数组的新副本。它只是在bytes[i]
存储对现有数组的引用。然后,您继续更改相同的reusable
数组,并在bytes[i]
处存储完全相同的引用。因此,您正在向bytes[]
填写对您所拥有的唯一reusable
数组的引用。
因此,在您的内部for
循环之前,执行int[] reusable = new int[8];
此时您不妨承认它不可重复使用,并为其提供更好的名称,例如temp
。
答案 1 :(得分:0)
bytes[i] = reusable;
这会将bytes[i]
指定为引用与reusable
相同的数组。因此,当您循环并更改reusable
的值时,更改会反映在bytes
的每一行中。您应该每次在循环中创建一个新的reusable
数组:
for (int i = 0; i < data.length/8; i++) {
int[] reusable = new int[8];
// ...
}