一、String
- 不可变
- String 内部使用字符数组来保存字符串内容,并且该数组是 final 修饰的,所以无法改变其长度。当对 String 进行修改时,实际上是创建了一个新的 String 对象,将修改后的字符串复制到新的对象中。
- 当修改一个String类型的字符串时需要会产生一个临时的String对象来存储修改后的字符串最后拷贝到目标字符串。
- 线程安全,但是如果频繁修改字符串(如拼接、替换)会产生大量临时对象,增加GC负担,性能较差。
- 适合存储常量字符串或不需要修改的场景。
二、StringBuilder
- 可变字符串。
- 原理:内部也使用字符数组来保存字符串内容,但是该数组没有被 final 修饰,可以改变其长度。当对 StringBuffer 进行修改时,直接在原有的字符数组上进行操作,不会创建新的对象。
- 缺点:不是线程安全的。
- 优点:
三、StringBuffer
- 线程安全的可变字符串。
- 可变原理:和StringBuilder原理一样。
- 线程安全:
- 原理:对所有修改操作(如 append(), insert(), delete() 等)都使用 synchronized 关键字修饰。
- 锁对象:锁住的是 StringBuffer 实例本身(即 this)
- 单线程的情况下效率低于StringBuilder