我认为没有理由为此代码段的输出底部应该与顶部不同。
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。
答案 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[]
是参考类型。这意味着list1
和list2
变量中的实际值只是数组的地址。
执行以下操作时,您并未真正复制数组。您只是复制数组的地址。
int[] list2 = list1;
由于list2
和list1
现在指向同一个数组,因此您对list2
元素所做的任何更改也将对list1
的元素进行更改,因为他们是相同的元素。