表格对比
String | StringBuffer | StringBuilder |
---|---|---|
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 | 可变类,速度更快 |
不可变 | 可变 | 可变 |
线程安全 | 线程不安全 | |
多线程操作字符串 | 单线程操作字符串 |
细节
-
StringBuffer与StringBuilder的扩容过程:默认情况下为原容量的2倍 + 2,同时将原有数组中的元素复制到新的数组中。
-
通过底层源码(下图)可知,
-
StringBuffer(StringBuilder同理)空参构造函数继承了父类,所以初始化容量(capacity)为16
-
也可以通过指定数值来初始化StringBuffer or StringBuilder的容量
-
当构造函数中的参数为字符串时,StringBuffer or StringBuilder的容量为字符串长度 + 16
-
切记:capacity 不等同于 length
-
总结
String:适用于少量的字符串操作。
StringBuilder:适用于单线程下在字符串缓冲区进行大量操作。
StringBuffer:适用于多线程下在字符串缓冲区进行大量操作。