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