以下代码生成此输出:
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]};
然后我得到了所需的输出。为什么会这样?
答案 0 :(得分:7)
present
被设置为引用到word
。 word
中的值未被复制。因此,当您更改present
中的值时,它实际上正在将present
“引用的变量”更改为:word
。
答案 1 :(得分:4)
byte[] present=word;
简单地复制引用并且对当前的任何修改都反映到单词:换句话说,写入将对单词应用相同的修改。 您必须执行System.arraycopy()以进行深层复制
答案 2 :(得分:4)
我认为你在这一行给出了同一个对象的两个引用:
byte[] present=word;
您不会克隆单词对象以将其用于其他事物。
答案 3 :(得分:2)
因为数组是引用类型变量。所以当你这样做时
byte[] present=word
您只需创建对同一对象的新引用。当然,无论如何改变对象都反映在所有参考文献中。 就是这样。
答案 4 :(得分:2)
“为什么单词会改变?”
因为你改变了它!哪里?这里:
byte[] present=word;
present[l + 1 - (l - (--l))] = abcd[1];
由于您使用=
来宣传present
,因此会引用word
。
而seconde行会更改present
和word
的值。
seconde版本有效吗?
byte[] present=new byte[]{abcd[0],abcd[0],abcd[0],abcd[0]};
因为你创建了一个全新的数组,而不是引用旧数组。
答案 5 :(得分:0)
似乎现在是指向单词的指针,这就是它改变它的原因。您可能希望通过执行以下操作来复制它:
byte[] present = new byte[word.length];
for (int i=0;i<word.length;i++) {
present[i] = word[i];
}
抱歉,如果我的Java很糟糕......我最近一直在使用Javascript整个日志,而且我可能已经混淆了。