String,StringBuffer与StringBuilder区别

是否可变:
  String:底层利用字符数组保存字符串常量,是不可变的,因为String类的原码中
有:private final char value[];因为有final修饰,所以String类的对象是不可改变的。
每次修String对象的值时,实际上是生成了一个新的对象,而指针指向了新的String,
而修改前String对象依然存在于内存中.
  
StringBuffer和StringBudder底层是利用字符数组保存字符串变量的,在jdk1.7中它
们都继承了AbstractStringBuilder类,而在AbstractStringBuilder类中有char[] value;,
所以这两者对象是可变的;

线程安全:
   String:String是final修饰的类,是不可变的,所以是线程安全的。
   StringBuffer:如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,
  StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的
   StringBuilder:如果一个StringBuilder对象在字符串缓冲区被多个线程使用时,则
  没有该关键字,所以不能保证线程安全。
 
运行速度快慢为:StringBuilder > StringBuffer > String
   String最慢的原因:
    String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String
对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的并且
String对象进行的操作实际上是一个  不断创建新的对象并且将旧的对象回收的一个过
程,所以执行速度很慢,而StringBuilder,StringBuffer的对象对变量进行操作就是直
接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。

       StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没
有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容