String、StringBuffer、StringBuilder区别
一、String
String 底层:
public final class String
//序列化、可排序类的排序方式、描述字符串结构的接口(三个常用子类String、StringBuffer和StringBuilder)
implements java.io.Serializable, Comparable<String>, CharSequence {
//由final修饰的字符数组,这里就注定String类型数据是不可修改的
private final char value[];
}
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:
需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,引入了两个新的类——StringBuffer类和StringBuild类。
二、StringBuilder和StringBuffer
继承结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RMT8WpCg-1633327921702)(C:\Users\点蓝红\AppData\Roaming\Typora\typora-user-images\image-20211004110825321.png)]
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
在代码实现中,StringBuffer的很多方法都会用Synchronized修饰,这样就解决了他的线程安全问题,但是在StringBuilder中却没由使用Synchronized的关键字进行同步处理。
所以为什么要学StringBuilder?因为StringBuilder相对于StringBuffer来说效率会提高10%~15%。
三、三者区别
String:不可变字符串;
StringBuffer:可变字符串、效率低、线程安全;
StringBuilder:可变字符串、效率高、线程不安全;
执行速度:StringBuilder > StringBuffer > String:
- String最慢:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
- 而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
小结:
-
如果要操作少量的数据用 String;
-
多线程操作字符串缓冲区下操作大量数据 StringBuffer;
-
单线程操作字符串缓冲区下操作大量数据 StringBuilder。