【问题标题】:How does sb2 in the below code holds abc but not abcd?下面代码中的 sb2 如何保存 abc 而不是 abcd?
【发布时间】:2019-12-10 05:13:24
【问题描述】:
    StringBuffer sb1 = new StringBuffer("abc");
    StringBuffer sb2 = new StringBuffer(sb1);

    sb1.append("d");

    System.out.println(sb2);

由于 StringBuffer 是可变的并且 sb2 指向 sb1,我希望 sb2 具有“abcd”作为值。 虽然这个问题是外行,但请你帮我解释一下。

【问题讨论】:

  • 也根据 StringBuilder 文档 建议优先使用此类而不是 StringBuffer

标签: java data-structures stringbuffer


【解决方案1】:

StringBuffer 在调用new StringBuffer(sb1) 时在堆中创建一个新对象。它不指向sb1
如果你想让sb2 指向sb1,那么声明StringBuffer sb2 = sb1

public StringBuffer(String str)

构造一个字符串缓冲区,初始化为 指定的字符串。字符串缓冲区的初始容量为 16 plus 字符串参数的长度。

【讨论】:

    【解决方案2】:

    如果您看到代码StringBuffer,则没有构造函数采用StringBuffer,而是在构造函数下方,因为StringBuffer 实现了CharSequence,这就是它起作用的原因。

    public StringBuffer(CharSequence seq)
    

    您的代码不起作用,因为它没有附加 StringBuffer 而不是它的内容。

    来自public StringBuffer(CharSequence seq)

    构造一个字符串缓冲区,其中包含与指定 CharSequence 相同的字符。字符串缓冲区的初始容量是 16 加上 CharSequence 参数的长度。

    【讨论】:

    • 即使有这样的构造函数也很可能克隆内容
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 2016-07-03
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 2019-08-25
    相关资源
    最近更新 更多