String buffer:Java StringBuffer在扩展后不会更改引用

关于String buffer的问题,在string buffer中经常遇到, 从StringBuffer docs:

StringBuffer docs

每个字符串缓冲区都有一个容量,只要字符串缓冲区中包含的字符序列的长度不超过该容量,就不必分配新的内部缓冲区数组,如果内部缓冲区溢出,则会自动使其变大。

根据我的理解,这意味着如果我们对字符串缓冲区使用append方法,并且给定字符串的长度超过字符串缓冲区的容量,JVM 将自动为新的字符串缓冲区分配更大的内存,并将旧的字符串缓冲区与给定的字符串一起存储。但是,在这种情况下,旧的字符串缓冲区和新的字符串缓冲区将如何具有相同的引用,如下所示。

public class test {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("initial value");
        System.out.println("before: the reference is " + System.identityHashCode(sb));
        sb.append(" - this message is append through sb and this message is longer than 16 bytes");
        System.out.println("after: the reference is " + System.identityHashCode(sb));
    }
}

输出

before: the reference is 511833308
after: the reference is 511833308
3

通常情况下,有一个间接层。实际的字符数据存储在char[]对象中(通常)。相同的StringBuffer(或StringBuilder)实例将其对char[]的引用从旧对象更改为新对象。没有newStringBuffer

java.lang.StringBuffer(和父类)的 Java 源代码是现成的,如果你想看看。

0

正如已经说过的,在附加字符串之后,StringBuffer引用不会改变,它仍然是相同的对象。它只是分配更大的数组来存储字符。另外值得一提的是,覆盖hashCode返回有意义字段的哈希是一个很好的做法,因为它会帮助您跟踪对象的突变,但是由于StringBuffer不返回

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(625)
在 R中将分类变量转换为数字
上一篇
世纪佳缘电脑网页登录:网页上未显示世纪哥特式字体
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(82条)