Java-String
Java-String
1. StringBuilder和StringBuffer的区别
StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是 StringBuffer 中的方法大都采用了 synchronized
关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。
在单线程程序下,StringBuilder 效率更快,因为它不需要加锁、不具备多线程安全;而 StringBuffer 则每次都需要判断锁,效率相对更低。
2. 扩容策略
StringBuilder 的初始容量可以容纳 16
个字符,当该对象的实体存放的字符的长度大于 16
时,实体容量就自动增加。StringBuilder 对象可以通过 length()
方法获取实体中存放的字符序列长度,通过 capacity()
方法来获取当前实体的实际容量。
StringBuilder(int size)
可以指定分配给该对象的实体的初始容量参数为 size
。当该对象的实体存放的字符序列的长度大于 size
个字符时,实体的容量就自动的增加。以便存放所增加的字符。
StringBuilder(String s)
可以指定给对象的实体的初始容量 size
为 s
的长度 额外再加 16
个字符。当该对象的实体存放的字符序列长度大于 size
个字符时,实体的容量自动的增加,以便存放所增加的字符。
2.1 扩容算法
使用 append()
方法在字符串后面追加东西的时候,如果长度超过了该字符串存储空间大小了就需要进行扩容:构建新的存储空间更大的字符串,将旧的复制过去;
- 在进行字符串
append()
的时候,会先计算追加后字符串大小; - 将追加后的字符串大小传入
ensureCapacityInternal()
,由这个方法进行是否扩容的判断;- 如果需要扩容就调用
expandCapacity()
进行扩容,尝试将新容量扩为大小变成当前容量 * 2 + 2
; if
判断一下,如果容量还是不够,直接扩充到需要的容量大小。
- 如果需要扩容就调用