【问题标题】:Don't understand the output不明白输出
【发布时间】:2015-04-20 20:45:35
【问题描述】:

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

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。

【问题讨论】:

  • 如果我们的某个答案对您有所帮助,请接受一个作为答案。

标签: java arrays for-loop output


【解决方案1】:

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

int[] list2 = list1;

到:

int[] list2 = list1.clone();

【讨论】:

  • 哇,在课堂上从来没有向我们解释过指向同一个对象的事情。因此,为了弄清楚这一点:原始代码中的 list1 和 list2 使用相同的数据集,即使它们具有不同的名称?
  • 阅读一点 C 和 Java 中的指针。它将阐明您对此的理解。 :)
【解决方案2】:

您的问题实际上出在以下行:

int[] list2 = list1;

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

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

int[] list2 = list1.clone();

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

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

【讨论】:

  • 这是给我的,我就是不明白为什么会有问题。
  • 我根本不会做 list.clone() 因为你复制 list1 而不是稍后覆盖它。
【解决方案3】:

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

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

int[] list2 = list1;

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

【讨论】:

  • 哇,你和其他人让这一切变得非常简单。真是太感谢你了。
猜你喜欢
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多