为什么此代码未按预期提供输出

时间:2019-04-10 05:38:55

标签: java stringbuffer

我期望输出为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");
           }
    }

2 个答案:

答案 0 :(得分:1)

所以最初,您有这个。

a -> [A...]         b -> [B...]

然后,当您调用operate时,会得到两个新变量,它们引用相同的两个StringBuffer对象。

a                   b 
   ->  [A...]          ->  [B...]
x                   y

然后将一个StringBuffer的内容附加到另一个。

a                     b 
   ->  [AB...]           ->  [B...]
x                     y

然后将另一个字母附加到第一个StringBuffer上,并重新指向变量y,以使其现在引用与StringBuffer和{{1 }}。

a

您再追加一个字母,现在将第一个x称为a x -> [ABC...] b -> [B...] y

StringBuffer

然后,您从y退出并打印出两个a x -> [ABCD...] b -> [B...] y 对象的内容。

答案 1 :(得分:0)

似乎您认为x.append(y)返回了存储在x中的新字符串,但事实并非如此。看起来here,看到它只是将指针返回到x

现在有了这种洞察力,请再次阅读代码,以了解输出。