String、StringBuffer、StringBuilder的区别

简介: 这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。

String 、StringBuilder、StringBuffer

① 由于String对象不可变,每个操作都会产生新的对象,效率非常低,并且频繁的创建对象也会浪费内存。

字符串拼接 + 的底层其实是StringBuilder.append()方法,下面原生的String字符拼接,底层其实会创建1000个StringBuilder对象,浪费堆内存空间。

public static void main(String[] args) {
   
    String str = "hello";
    for(int i = 0;i<1000;i++){
   
        str = str + i;
    }
}

改进版使用StringBuilder进行拼接,只创建了一个StringBuilder对象。

public static void main(String[] args) {
   
    String str = "hello";
    StringBuilder sb = new StringBuilder(str);
    for(int i = 0;i<1000;i++){
   
        sb.append(i);
    }
}

② StringBuilder类,可以在原字符串的基础上进行操作,并且不会开辟额外的内存空间,从而弥补了String类的缺陷。

image.png

③ StringBuffer的话基本和StringBuilder类差不多,只是StringBuffer类对于字符串的操作方法添加了synchronized关键字,这样一来对于字符串的操作就是线程安全(可以同步访问)的。

image.png
image.png

StringBuffer和StringBuilder的对比:

  • StringBuffer线程更安全,StringBuilder速度更快。
  • 修改字符串推荐使用StringBuffer,但是StringBuilder速度更快,通常都是使用StringBuilder。

④ 常用方法(StringBuilder和StringBuffer都差不多,就列举StringBuffer的了):

方法 说明
StringBuffer append(String str) 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、 double、float、int、long、Object、String、StringBuff的变量
char charAt(int index) 获取index位置的字符
int length() 获取字符串的长度
int capacity() 获取底层保存字符串空间总的大小
void ensureCapacity(int mininmumCapacity) 扩容
void setCharAt(int index, char ch) 将index位置的字符设置为ch
int indexOf(String str) 返回str第一次出现的位置
int indexOf(String str, int fromIndex) 从fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str) 返回最后一次出现str的位置
int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找str最后一次出现的位置
StringBuffer insert(int offset, String str) 在offset位置插入:八种基类类型 & String类型 & Object类型数据
StringBuffer deleteCharAt(int index) 删除index位置字符
StringBuffer delete(int start, int end) 删除[start, end)区间内的字符
StringBuffer replace(int start, int end, String str ) 将[start, end)位置的字符替换为str
String substring(int start) 从start开始一直到末尾的字符以String的方式返回
String substring(int start,int end) 将[start, end)范围内的字符以String的方式返回
StringBuffer reverse() 反转字符串
String toString() 将所有字符按照String的方式返回
public static void main(String[] args) {
   
   // 1.StringBuilder 常用方法 capacity length append reverse delete insert replace
    StringBuilder sb = new StringBuilder(10);

    System.out.println(sb.capacity()); //10
    System.out.println(sb.length()); // 0

    sb.append("robin");
    System.out.println(sb);
    sb.append("-----");
    sb.append("debug");
    System.out.println(sb);

    sb.reverse();
    System.out.println(sb);

    sb.delete(0,3);
    System.out.println(sb);

    sb.insert(0,"ok!");
    System.out.println(sb);

    sb.replace(0,3,"no");
    System.out.println(sb);

}

⑤ 小结:String、StringBuffer、StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  2. StringBuffer与StringBuilder大部分功能是相似的
  3. StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作
相关文章
|
2月前
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
50 1
|
3天前
|
canal 安全 索引
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
(StringBuffer和StringBuilder)以及回文串,字符串经典习题
16 5
|
29天前
|
安全 Java
Java StringBuffer 和 StringBuilder 类详解
在 Java 中,`StringBuffer` 和 `StringBuilder` 用于操作可变字符串,支持拼接、插入、删除等功能。两者的主要区别在于线程安全性和性能:`StringBuffer` 线程安全但较慢,适用于多线程环境;`StringBuilder` 非线程安全但更快,适合单线程环境。选择合适的类取决于具体的应用场景和性能需求。通常,在不需要线程安全的情况下,推荐使用 `StringBuilder` 以获得更好的性能。
|
2月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
2月前
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
69 0
|
23天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
30 0
java基础(13)String类
|
2月前
|
API 索引
String类下常用API
String类下常用API
38 1
|
20天前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
3天前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
17 2
|
9天前
|
安全 C语言 C++
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析
27 4