为什么这段代码没有按预期给出输出[关闭]

问题描述 投票:-2回答:2

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

java stringbuffer
2个回答
1
投票

所以最初,你有这个。

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

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

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

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

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

然后你将另一个字母附加到第一个StringBuffer,并重新指向变量y,使它现在引用与StringBuffera相同的x

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

你再追加一封信,现在引用第一个StringBuffer作为y

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

然后退出operate并打印出两个StringBuffer对象的内容。


0
投票

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

现在有了这种洞察力,再次阅读您的代码并看到您理解输出。

© www.soinside.com 2019 - 2024. All rights reserved.