目录
String
String 是不可变的,定义之后不能再修改,看源码可知,内部结构是一个 final 类型的 char 数组。
我们所说的字符串变化了,是因为引用指向了新对象而已。
StringBuilder
StringBuilder 和 ArrayList 非常像,内部结构都是数组,都支持动态扩容。
使用 append 方法拼接字符串更加方便。
StringBuffer
StringBuffer 基本上和 StringBuilder 完全一样。
明显的不同就是 StringBuffer 是线程安全的,除了构造方法之外的所有方法都用了 synchronized 关键字修饰。
同步牺牲了性能,性能上要比 StringBuilder 差一些。
字符串拼接
使用字符串连接符+
做字符串拼接,每做一次拼接,就需要创建一个 StringBuilder 对象。(可以从反编译代码中看出)
PS:String str = 'a' + 'b' + 'c'
算作一次拼接。
在连续多次拼接的场景中,既消耗资源拼接速度又慢。(创建对象需要消耗资源与时间、扩容需要时间)
【原则很简单】
拼接字符串使用 StringBuilder 的 append 方法。
而且如果我们已经知道了字符串容量,可以一次性分配一个 StringBuilder,避免扩容时候的开销。