2D阵列内的项目意外更改

时间:2017-07-30 18:32:41

标签: java arrays multidimensional-array

    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]

2 个答案:

答案 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];
    // ...
}