看不懂输出

Don't understand the output

我看不出为什么此代码段的输出在底部与顶部不同。

public static void main(String[] args) {       

        int[] list1 = {2, 4, 8, 16, 32, 64, 128, 256};
        int[] list2 = list1;
        int max = list1.length - 1;
        for (int k = 0; k < list1.length; k++) {
            System.out.print(list1[k] + " ");
            list2[k] = list1[max - k];
        }
        System.out.print("\n");
        for (int k = 0; k < list1.length; k++) {
            System.out.print(list1[k] + " ");
        }
    }

输出:

2 4 8 16 32 64 128 256 
256 128 64 32 32 64 128 256

输出的顶部是 list1 的内容。 我也在为第二个打印出 list1,但我看不出有什么不同的理由。 list2 改变了,但 list1 永远不会改变。

这是学校的,我很困惑为什么这两个输出不同。

编辑: 我知道它与 list2[k] = list1[max - k]; 有关,但我不明白为什么这会以任何方式改变 list1。

您的问题实际上与以下行有关:

int[] list2 = list1;

这导致您在内存中有两个对同一个对象的引用。因此,当您进行分配时(您认为问题所在的位置),您将把最后一个元素放入第一个槽中,将倒数第二个元素放入第二个槽中,依此类推,直到到达中间,然后您正在将新值复制回去,这意味着它们实际上并没有改变。

您可能想要做的是使用 clone() 方法单独复制 list1,如下所示:

int[] list2 = list1.clone();

但是(正如 GRC 指出的那样),在这种情况下甚至没有理由制作副本,因为您的计划是无论如何都要覆盖所有内容。因此,您只需执行以下操作:

int[] list2 = new int[list1.length];

它们是不同的,因为两个变量都指向同一个对象。 要获得相同的结果,请替换此行:

int[] list2 = list1;

至:

int[] list2 = list1.clone();

int[] 是引用类型。这意味着 list1list2 变量中的实际值只是数组的地址。

当您执行以下操作时,您并没有真正复制数组。您只是在复制数组的地址。

int[] list2 = list1;

由于 list2list1 现在指向同一个数组,您对 list2 的元素所做的任何更改也将对 [=12= 的元素进行], 因为它们是相同的元素。