String, StringBuffer, StringBuilder 区别
-
可变性
-
String
-
String在类中使用final关键字修饰字符数组来保存字符串
-
使得String是不可变的
-
private final char value[]
-
在Java9中String改用为byte数组来保存字符串
-
private final byte[] value
-
小发现
-
Java的数组定义支持两种格式
-
int[] a Java推荐的格式
-
int a[] 迎合C语言入门习惯
-
StringBuffer
-
StringBuilder
-
StringBuffer 和StringBuilder 继承AbstractStringBuilder
-
AbstractStringBuilder 类中没有使用final关键字修饰字符数组来保存字符串
-
使得这两个子类是可变的
-
private char value[]
-
线程安全性
-
等级
-
不可变
-
在java中Immutable(不可变)对象一定是线程安全的,
-
因为线程的调度和交替执行不会对对象造成任何改变
-
绝对线程安全
-
相对线程安全
-
线程兼容
-
线程对立
-
String
-
由于String是不可变的,可以理解为常量,所以线程安全
-
StringBuffer
-
StringBuffer对方法加了同步锁【Synchronized】或者对调用的方法加了同步锁,所以是线程安全
-
StringBuilder
-
StringBuilder没有对方法加同步锁,所以是非线程安全
-
性能
-
String
-
每次对String类型进行改变时,都会生成一个新的String对象
-
并将指针指向新的对象
-
StringBuffer
-
StringBuffer每次改变都是对自身进行操作
-
不会生成新的对象并改变对象引用
-
StringBuilder
-
与StringBuffer对比,性能提升10%~15%,但多线程不安全
-
使用总结
-
String
-
适合操作少量的数据的情况
-
StringBuffer
-
多线程操作字符串缓冲区下操作大量数据
-
StringBuilder
-
单线程操作字符串缓冲区下操作大量数据