> 文档中心 > Java基础 |12.String、StringBuffer和StringBuilder

Java基础 |12.String、StringBuffer和StringBuilder

文章目录

  • 参考文章
  • 1.整体总述
  • 2.String
  • 3.StringBuffer和StringBuilder
    • 3.1.整体概述
    • **3.2.二者区别**
  • 4.特例解析
    • 4.1.例子与结论
    • 4.2.结论分析

参考文章

String、StringBuffer与StringBuilder之间区别

1.整体总述

字符串变量 是否可变 特点
String
StringBuffer 效率低,线程安全(多线程)
StringBuilder 效率高,线程不安全(单线程常用)

如果某字符串经常变动,应该使用具备可变性的StringBufferStringBuilder

StringBuilder的效率更高,因此在非多线程的情况下应优先选择。

2.String

String对象是不可变的,底层是一个由final关键字修饰的char数组:

private final char value[];

一旦定义好,之后的所谓的更改,实际上都是在生成新的对象,并重新将引用指向这个新的对象

以拼接hello和World为例:

String str = "hello"//为"hello"分配内存str = str + "World" //为"World"分配内存,再为"helloWorld"分配内存

Java基础 |12.String、StringBuffer和StringBuilder

实现上述拼接,生成一个"helloWorld"字符串,就占用了三份内存。

3.StringBuffer和StringBuilder

3.1.整体概述

  • StringBufferStringBuilder类对象是可变的,内容的改变并不会产生新的对象

  • 常用于涉及拼接、删减、插入等操作时对字符串的定义。

继承关系如下图所示:

Java基础 |12.String、StringBuffer和StringBuilder

3.2.二者区别

  • StringBuffer执行速度较慢,使用synchronized保证线程安全(支持多线程)
  • StringBuilder执行速度更快,线程不安全(只支持单线程)

由于StringBuilder速度占优,大部分情况都应优先使用StringBuilder

4.特例解析

4.1.例子与结论

分析以下代码:

// 01.使用String实现"拼接"String str1 = "hello" + "World";// 02.使用String实现拼接String str1 = "hello";String str2 = "World";String str3 = str1 + str2;// 03.使用StringBuilder实现拼接StringBuilder sb = new StringBuilder()    .append("hello")    .append("World");

以上三种情况的效率比较是:

第一种 > 第三种 > 第二种

4.2.结论分析

1) 第一种其实是伪拼接,实际在执行时,JVM会认为以下两行代码等效:

String str1 = "hello" + "world";String str1 = "helloWorld";

因此JVM只会为其分配一份的内存资源,而并没有真正拼接,因此效率最快

2) 第二种则是真正的拼接了,执行时JVM会分配三份内存资源,因此效率最差

3) 第三种是使用StringBuilder拼接,JVM会为其分配一份内存资源,数值相同的情况下,StringBuilder相比String消耗的资源会更多一些。