【问题标题】:How does this variable get changed?这个变量是如何改变的?
【发布时间】:2013-08-02 19:57:35
【问题描述】:

以下代码产生此输出:

aaab -> aabb -> abbb -> bbbb

我的目标是让它看起来像这样:

aaab -> aaba -> abaa -> baaa

但是我很难弄清楚为什么我会得到这个结果。

    String abcd = 'abcd';
    int l=3;
    byte[] word=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};
    System.out.println(new String(word)); // print: aaaa
    while (l >= 0) {
        byte[] present=word; // !!!
        present[l + 1 - (l - (--l))] = abcd[1];
        System.out.println(new String(present)); // print: aaab -> aabb -> abbb -> bbbb
    }
    System.out.println(new String(word)); // print: bbbb

如果我更改此行(5):byte[] present=word;

byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};

然后我得到所需的输出。为什么会这样?

【问题讨论】:

  • byte[] present=word; 这不会复制数组 - 这会导致 present 引用与 word 相同的数组。
  • 我不写:word=present,我写:present=word。那么现在必须改变,而不是文字。
  • @satiate 除了wordpresent 将引用同一个数组。更改word[0] 也将反映在present[0] 上。

标签: java arrays variables


【解决方案1】:

present 被设置为word引用word 中的值不会被复制。因此,当您更改 present 中的值时,实际上是在更改 present“引用”的变量:word

【讨论】:

    【解决方案2】:
    byte[] present=word;
    

    简单地复制引用并且对present的任何修改都会反映到word:换句话说,write to present会将相同的修改应用于word。 您必须执行 System.arraycopy() 才能进行深层复制

    【讨论】:

    • 谢谢。我去阅读有关 System.arraycopy 并遇到另一个版本:byte[] present=word.clone();
    【解决方案3】:

    我认为您在这一行中为同一个对象提供了两个引用:

    byte[] present=word;
    

    您不会克隆单词 object 以将其用于其他事物。

    【讨论】:

      【解决方案4】:

      因为数组是引用类型的变量。所以当你这样做时

      byte[] present=word
      

      您只需创建对同一对象的新引用。当然,无论如何更改对象都会反映在所有引用中。 就是这样。

      【讨论】:

        【解决方案5】:

        “为什么字变了?”

        因为你改变了它!在哪里?这里:

        byte[] present=word;
        present[l + 1 - (l - (--l))] = abcd[1];
        

        由于您使用= 来初始化present,因此它引用了word
        第二行更改了presentword 的值。

        第二个版本在哪里工作?

        byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};
        

        因为您创建了一个新的数组,而不是引用旧的。

        【讨论】:

          【解决方案6】:

          现在似乎是一个指向单词的指针,这就是它改变它的原因。您可能想通过执行以下操作来复制它:

          byte[] present = new byte[word.length];
          for (int i=0;i<word.length;i++) {
            present[i] = word[i];
          }
          

          如果我的 Java 不好,抱歉……我最近一直在使用 Javascript,我可能搞混了。

          【讨论】:

          • 我不会真正称它们为指针,而是references
          猜你喜欢
          • 2011-12-10
          • 1970-01-01
          • 2015-02-05
          • 2019-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-04
          • 1970-01-01
          相关资源
          最近更新 更多