String,StringBuffer,StringBuilder的区别

 

1.三个类之间的关系

都是通过字符数组来实现的

StringBuffer和StringBuilder都继承自AbstractStringBuilder这个类

AbstractStringBuilder和String都继承自Object这个类

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

String类没有append()、delete()、insert()这三个成员方法,而StringBuffer和StringBuilder都有这些方法

StringBuffer和StringBuilder中的append、delete、insert这几个成员方法都是通过System类的arraycopy方法来实现的,即将原数组复制到目标数组

3.执行速度

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

  String < StringBuffer

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

  String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢

  StringBuffer < StringBuilder

  StringBuffer是线程安全的,而StringBuilder是非线程安全的

  StringBuffer类中的大部分成员方法都被synchronized关键字修饰,而StringBuilder类没有出现synchronized关键字

  在运行速度方面StringBuffer<StringBuilder,这是因为StringBuffer由于线程安全的特性,常常应用于多线程的程序中,为了保证多线程同步一些线程就会遇到阻塞的情况,这就使得StringBuffer的运行时间增加,从而使得运行速度减慢;而StringBuilder通常不会出现多线程的情况,所以运行时就不会被阻塞,运行速度也自然就比StringBuffer快了。

 

文章来源:

https://www.cnblogs.com/Wilange/p/7570633.html

https://www.cnblogs.com/Wilange/p/7572125.html

posted @ 2019-08-13 11:38  草木物语  阅读(183)  评论(0编辑  收藏  举报