每个字符串缓冲区都有一个容量,只要字符串缓冲区中包含的字符序列的长度不超过该容量,就不必分配新的内部缓冲区数组,如果内部缓冲区溢出,则会自动使其变大。
根据我的理解,这意味着如果我们对字符串缓冲区使用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
通常情况下,有一个间接层。实际的字符数据存储在char[]
对象中(通常)。相同的StringBuffer
(或StringBuilder
)实例将其对char[]
的引用从旧对象更改为新对象。没有newStringBuffer
。
java.lang.StringBuffer
(和父类)的 Java 源代码是现成的,如果你想看看。
正如已经说过的,在附加字符串之后,StringBuffer
引用不会改变,它仍然是相同的对象。它只是分配更大的数组来存储字符。另外值得一提的是,覆盖hashCode
返回有意义字段的哈希是一个很好的做法,因为它会帮助您跟踪对象的突变,但是由于StringBuffer
不返回
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(82条)