- String 是一个Immutable(不可变)类,包括类不可继承,类的属性不可更改。作为Java中基础是字符串类,每次字符串的拼接赋值都是新建一个对象进行操作。所以为了提高字符串拼接移除部分的性能,提供了线程安全的StringBuffer和不保证线程安全的StringBuilder。
- StringBuffer 是一个线程安全的类,具体实现的字符串拼接时通过一个字符串数组进行存储的。性能较String的字符串拼接提高了许多。StringBuffer 通过在方法上添加synchronized 保证线程安全。
- StringBuilder 非线程安全类,实际上和StringBuffer 都是继承了AbstractStringBuilder,区别在于StringBuilder的方法上没有家同步,所以无法保证线程安全。但同时性能高了很多。
-
两个字符串操作类的初始化大小都是16,每次扩容都是2的倍数。扩容时通过新建数组copy生成新的数组,消耗比较大。这就要求尽可能在使用时指定合适的初始化大小,避免扩容造成的性能浪费和浪费空间。