码迷,mamicode.com
首页 > 其他好文 > 详细

String、StringBuffer、StringBuilder区别

时间:2018-05-31 20:37:58      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:行操作   highlight   https   技术分享   可变   blank   buffer   功能   nal   

1.三个类之间的关系

StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类,而AbstractStringBuilder和String都继承自Object这个类(Object是所有java类的超类)

技术分享图片

 

2.String是不可变类,而StringBuffer, StringBuilder是可变类

  我们查看这三个类的源码,String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。源码中 private final char value[]; 因为value被final修饰,所以不可变

而StringBuffer 与 StringBuilder 中的方法和功能完全是等价的,只是StringBuffer 中的方法大都采用了 synchronized 关键字进行修饰,因此是线程安全的,而 StringBuilder 没有这个修饰,可以被认为是线程不安全的。

3.执行速度 (性能) 上对比

 在执行速度上,String < StringBuffer < Stringbuilder 。

  3.1 String < StringBuffer

  这是因为String类是不可变的,即字符串常量,所以每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。这就会对程序运行产生很大的影响,因为当内存中的无引用对象多了以后,JVM的GC进程就会进行垃圾回收,这个过程会耗费很长一段时间,因此经常改变内容的字符串最好不要用 String类的对象。而如果是使用 StringBuffer 类则结果就不一样了,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
  但是在某些特殊情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 运行速度是远要比 StringBuffer 快的:

技术分享图片

  但是如果要拼接的字符串来自于不同的String对象的话,那结果就不一样了:

技术分享图片

  这时候使用StringBuffer的运行速度更快

String、StringBuffer、StringBuilder区别

标签:行操作   highlight   https   技术分享   可变   blank   buffer   功能   nal   

原文地址:https://www.cnblogs.com/wanghongsen/p/9118556.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!