为什么这段代码没有按预期给出输出
Why this code is not giving the output as expected
我原以为输出是 AB , ABCD 但输出是 ABCD , B。这怎么可能?
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + " " + " , " + " " + b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x.append("C");
y.append("D");
}
}
所以最初,你有这个。
a -> [A...] b -> [B...]
然后当您调用 operate
时,您会得到两个引用相同的两个 StringBuffer
对象的新变量。
a b
-> [A...] -> [B...]
x y
然后将一个 StringBuffer
的内容附加到另一个
a b
-> [AB...] -> [B...]
x y
然后您将另一个字母附加到第一个 StringBuffer
,并重新指向变量 y
,这样它现在引用与 a
和 x
.
a
x -> [ABC...] b -> [B...]
y
然后您再附加一个字母,现在将第一个 StringBuffer
引用为 y
。
a
x -> [ABCD...] b -> [B...]
y
然后退出 operate
并打印出两个 StringBuffer
对象的内容。
您似乎认为 x.append(y)
return 新字符串存储在 x
中,但事实并非如此。查看 here,并看到它只是 return 指向 x 的 指针。
现在有了这种洞察力,再次阅读您的代码并了解您对输出的理解。
我原以为输出是 AB , ABCD 但输出是 ABCD , B。这怎么可能?
public class Test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + " " + " , " + " " + b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x.append("C");
y.append("D");
}
}
所以最初,你有这个。
a -> [A...] b -> [B...]
然后当您调用 operate
时,您会得到两个引用相同的两个 StringBuffer
对象的新变量。
a b
-> [A...] -> [B...]
x y
然后将一个 StringBuffer
的内容附加到另一个
a b
-> [AB...] -> [B...]
x y
然后您将另一个字母附加到第一个 StringBuffer
,并重新指向变量 y
,这样它现在引用与 a
和 x
.
a
x -> [ABC...] b -> [B...]
y
然后您再附加一个字母,现在将第一个 StringBuffer
引用为 y
。
a
x -> [ABCD...] b -> [B...]
y
然后退出 operate
并打印出两个 StringBuffer
对象的内容。
您似乎认为 x.append(y)
return 新字符串存储在 x
中,但事实并非如此。查看 here,并看到它只是 return 指向 x 的 指针。
现在有了这种洞察力,再次阅读您的代码并了解您对输出的理解。