String、StringBuffer、StringBuilder的区别是什么?为什么String是不可变的?

String、StringBuffer、StringBuilder的区别是什么?为什么String是不可变的?

String、StringBuffer、StringBuilder的区别是什么

String:不可变

StringBuffer:可变的,线程安全

StringBuilder:可变的,线程不安全

可变性:

简单而言,String类使用Final关键字字符数组保存字符串,private final char[] value,所以String是不可变的。而StringBuffer 和 StringBuilder 都是继承自AbstractStringBuilder,而AbstractStringBuilder 也是使用使用字符数组保护字符串,不过没有final关键字,char[] value,所以后两者是可变的

线程安全:

String因为是不可变,也可理解为常量,因此是线程安全的。而StringBuffer 和 StringBuilder 继承自AbstractStringBuilder,而AbstractStringBuilder定义了一些基本字符操作,如append、insert、indexOf等,在StringBuffer的方法中加了同步锁,因此StringBuffer是线程安全的。而StringBuilder没有相应的锁,所以非线程安全。

性能:

String类型进行改变都是创建新的字符串代替旧的,而后两者都是在自身改变,所以性能要好于String。而StringBuilder因为没有加同步锁,所以性能略优于StringBuffer,但是会有线程不安全的风险

对三者使用的总结:

操作量少:String

单线程操作量大:StringBuilder

多线程操作量大:StringBuffer

风雨相关