文章目录
前言
其实很早的时候有看过 String,StringBuffer,StringBuilder 这三个的区别的,但到现在也忘得差不多了,趁着今儿又碰到了,赶紧查漏补缺一下;
对比
1、长度:
- String 长度不可变;
- StringBuffer 和 SringBuilder 长度可变;
2、运行速度:
- SringBuilder > StringBuffer > String;
3、线程安全:
- SringBuilder 线程不安全;
- StringBuffer 线程安全;
分析
String
Java 提供了 String 类来创建和操作字符串,但是 String 的长度是不可变的,这就导致每次对 String 的操作都会生成新的 String 对象,这样不仅效率低下,而且大量浪费有限的内存空间。
由于 String 类型的字符串长度是不可变的,因此运行速度也会受到影响,比如下述一段代码:
public static void main(String[] args) {
String str = "Hello, ";
System.out.println(str);
str = str + "World! ";
System.out.println(str);
}
JVM 先创建了一个 str
对象,将 “Hello, ” 赋值给 str
,然后在内存中又创建了第二个 str
对象,将第一个 str
对象中的 “Hello, ” 与 “World! ” 相加再赋值给第二个 str
对象,此时 Java 虚拟机的垃圾回收机制开始其工作将第一个 str
对象回收。所以说 String 类型的字符串要完成这样改变长度的操作需要不断地创建再回收,回收再创建,无形中经过了很多步骤;
StringBuffer & SringBuilder
public final class StringBuffer extends AbstractStringBuilder
public final class StringBuilder extends AbstractStringBuilder
可以看出,相较于 String 类型,StringBuffer 和 StringBuilder 是可变长度的,其对象能够被多次的修改,并且不产生新的未使用对象;
StringBuffer 上的主要操作是 append
和 insert
方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append
方法始终将这些字符添加到缓冲区的末端;而 insert
方法则在指定的点添加字符。
StringBuilder 也是同理的;
但是通过对比可以发现,StringBuffer 多了一个同步锁,因此就造成了 SringBuilder 速度比 StringBuffer 快,但是 SringBuilder 线程不安全,而 StringBuffer 线程安全;
后记
关于 String,StringBuffer,StringBuilder,主要就是上述内容,理清差别,合理使用!