String 底层实现
private final char value[];
String 的值是不可变的,每次对 String 的操作都会生成新的 String 对象,造成内存浪费
StringBuffer 和 StringBuilder 继承了 AbstractStringBuilder
AbstractStringBuilder中
char[] value;
是可变的字符数组
所以在进行频繁的字符串操作时,建议使用StringBuffer和StringBuilder来进行操作
StringBuffer
是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来额外的性能开销
StringBuffer类中方法定义前面都会有synchronize关键字
StringBuilder
是线程不安全的
StringBuffer的性能要远低于StringBuilder
性质 | 效率 | 线程安全 | |
String | 常量 | 慢 | / |
StringBuffer | 变量 | 快 | 安全 |
StringBuilder | 变量 | 快+ | 不安全 |
应用场景
[1]在字符串内容不经常发生变化的业务场景优先使用String类
eg:
常量声明、少量的字符串拼接操作等。
如果有大量的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)
[2]在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程环境下,建议使用StringBuffer
eg:
XML解析、HTTP参数解析与封装
[3]在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程环境下,建议使用StringBuilder
eg:
SQL语句拼装、JSON封装等