不要理解输出

时间:2015-04-20 20:45:35

标签: java arrays for-loop 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。

3 个答案:

答案 0 :(得分:5)

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

int[] list2 = list1;

为:

int[] list2 = list1.clone();

答案 1 :(得分:3)

您的问题实际上是以下一行:

int[] list2 = list1;

这导致您在内存中有两个对SAME对象的引用。因此,当你执行任务时(你认为你的问题在哪里),你将最后一个元素放入第一个插槽,第二个元素放到第二个插槽中,依此类推,直到你到达中间,然后你正在复制新值,这意味着它们实际上并没有改变。

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

int[] list2 = list1.clone();

然而(正如GRC指出的那样),在这种情况下甚至没有理由制作副本,因为你的计划是覆盖所有内容。所以,您可以执行以下操作:

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

答案 2 :(得分:1)

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

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

int[] list2 = list1;

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