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

posted @ 2020-04-11 22:07  Coding-Liu  阅读(432)  评论(0)    收藏  举报