详解Java中的StringStringBuffer和StringBuilder

Posted Ferron Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解Java中的StringStringBuffer和StringBuilder相关的知识,希望对你有一定的参考价值。

1、介绍

  • java.lang.String:这个类产生的对象是不可变的,每次都会产生一个新的对象,这就会导致内存空间的浪费。String类是被final修饰符修饰的,这也就表示它不能被继承。String实现了三个接口:Serializable、Comparable、CarSequence,其中Comparable表示了其可以使用compareTo()方法进行比较。
  • java.lang.StringBuffer():这个类产生的对象是可变的,且线程安全的。该类继承了AbstractStringBuilder父类,实现了Serializable, Comparable, CharSequence接口,但是其compareTo()方法无法进行字符串的比较。
  • java.lang.StringBuilder():这个类产生的对象是可变的,但是线程是不安全的。该类也继承了AbstractStringBuilder父类,实现了Serializable, Comparable, CharSequence接口,但也是其compareTo()方法无法进行字符串的比较。

2、性能区别

  • String类每次都会创建一个新的对象,相当于每次都需要新建一个对象同时回收掉旧的对象,因此,操作String的效率是十分低下的。而StringBuilder和StringBuffer均为字符串变量,其创建之后是可以更改的,因此StringBuilder和StringBuffer执行速度会比String速度快。
  • 我们再来比较StringBuilder和StringBuffer的执行速度。StringBuffer是线程安全的,其所有公共方法会被synchronized关键字所修饰,因此每次调用StringBuffer的方法都会加锁同步,而StringBuilder则无需加锁,因此StringBuilder的性能优于StringBuffer
  • StringBuffer缓冲区优化:StringBuffer每次调用toString方法时都会直接调用缓冲区toStringCache的值来构造字符串,而StringBuilder则是通过复制字符数组的方法来构造字符串,因此在这一点上StringBuffer是优于StringBuilder的。不过,StringBuffer的toString方法仍然是线程安全的。
  • 性能:StringBuilder>StringBuffer>String

3、线程安全

  • 而在线程是否安全上,StringBuffer是线程安全的,StringBuilder是非线程安全的。原因就是StringBuffer的所有公共方法都是用synchronized关键字修饰的
  • StringBulider适用于单线程情况下,StringBuffer适用于多线程情况下。

以上是关于详解Java中的StringStringBuffer和StringBuilder的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 中的 Streams API 详解

Java中的异常处理详解

Java 8 中的 Streams API 详解

Java 8 中的 Streams API 详解

java中的String类常量池详解

Java中的Filter详解 --基础篇