在Java中,String是一个常量,一旦创建其值后不能更改但可以共享。
如果我们把多个字符串进行连接(拼接)操作,就会开辟很多空间,从而造成了大量内存空间的浪费。
为了解决这个问题,我们需要用到StringBuffer类和StringBuilder类。
StringBuffer与StringBuilder的区别
共同点:底层数据结构都是char类型的数组,都是可变的字符串。
不同点:StringBuffer
线程同步的安全性高,但多线程操作时效率低。StringBuilder
线程不同步,进行多线程操作时,安全性低,但效率高。
因为这两个类的用法都类似,所以我就以StringBuffer类为例来讲解。
构造方法:StringBuffer()
方法描述:构造一个没有字符的字符串缓冲区,初始容量为16。
public StringBuffer() {
super(16);
}
构造方法:StringBuffer(String str)
方法描述:构造一个初始化为指定字符串内容的字符串缓冲区,初始容量为str.length() + 16。
public StringBuffer(String str) {
super(str.length() + 16);
append(str);
StringBuffer的扩容原理
扩容原理:
StringBuffer
的底层数组结构用的是char
类型的数组。
所以,当我们使用StringBuffer
对象的append(...)
方法追加数据时,如果char类型数组的长度无法容纳我们追加的数据,StringBuffer
就会进行扩容。
扩容时会用到Arrays
类中的copyOf(...)
方法,每次扩容的容量大小是原来的容量的2倍加2。
注: append(...)中的...代表各种类型的参数,如append(int i)、append(char c)、append(String str)等。copyOf(...)
中的...
代表各种类型的参数,如 copyOf(int[] original, int newLength)、copyOf(char[] original, int newLength)等