探究 String,StringBuffer,StringBuilder

前言

其实很早的时候有看过 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 上的主要操作是 appendinsert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
StringBuilder 也是同理的;

但是通过对比可以发现,StringBuffer 多了一个同步锁,因此就造成了 SringBuilder 速度比 StringBuffer 快,但是 SringBuilder 线程不安全,而 StringBuffer 线程安全;
 

后记

关于 String,StringBuffer,StringBuilder,主要就是上述内容,理清差别,合理使用!

Guess you like

Origin blog.csdn.net/weixin_46263782/article/details/121237245