2

以下代码产生此输出:

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]};

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

4

6 回答 6

7

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

于 2013-08-02T20:01:01.973 回答
4
byte[] present=word;

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

于 2013-08-02T20:01:48.617 回答
4

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

byte[] present=word;

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

于 2013-08-02T20:02:00.343 回答
2

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

byte[] present=word

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

于 2013-08-02T20:01:42.733 回答
2

“为什么换字了?”

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

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

由于您曾经使用=initlaize present,因此它引用了word.
而第二行改变了present和的值word

第二版在哪里工作?

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

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

于 2013-08-02T20:01:59.070 回答
0

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

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

对不起,如果我的 Java 不好...我最近一直在使用 Javascript 整个日志,我可能搞混了。

于 2013-08-02T20:01:29.937 回答