36、Java基础教程之常用类库·StringBuffer与StringBuilder类

  • 1️⃣ StringBuffer类
    • 1.1 概念
  • 1.2 特征
  • 1.3 使用
  • 2️⃣ StringBuilder类
    • 2.1 概念及特征
  • 2.2 使用
  • 3️⃣ String、StringBuffer和StringBuilder的对比
  • * 本文源码下载地址

*

1️⃣ StringBuffer类

1.1 概念

在Java 中,字符串使用 String 类进行表示,但是 String 类所表示的字符串有一个最大的问题:“字符串常量一旦声明则不可改变,而字符串对象可以改变,但是 改变的是其内存地址的指向”。所以String类不适合于被频繁修改的字符串操作, 所以在这种情况下,往往可以使用 StringBuffer 或者StringBuilder类,即 StringBuffer 类或者StringBuilder类更方便用户进行内容的修改。

String 类中使用 “+” 作为数据库的连接操作,而在 StringBuffer类中使用 append() 方法进行数据的连接。方法定义:

public StringBuffer append(数据 类型变量);

//	范例 1: 观察StringBuffer 基本使用
package com.xiaoshan.demo;

public class TestDemo {
   
     
	public static void main(String[] args) throws Exception{
   
     
		//String类可以直接赋值实例化,但是StringBuffer类不行
		StringBuffer buf = new StringBuffer();              //实例化StringBuffer类对象
		buf.append("Hello ").append("XIAOSHAN ").append("!");
		change(buf);       //引用传递
		System.out.println(buf);
	}	
	public static void change(StringBuffer temp){
   
        // 接收StringBuffer引用
		temp.append("\n").append("'https://blog.csdn.net/lvsongtao1225/category_12367710.html");//修改内容
	}
}

程序执行结果:

Hello XIAOSHAN !
https://blog.csdn.net/lvsongtao1225/category_12367710.html

此程序利用 StringBuffer 类对象实现了引用传递,并且通过最终的结果发现,在 change() 方法中针对 StringBuffer 对象的修改可以影响原始 StringBuffer 类对象,所以 StringBuffer 对象的内容是可以修改的。

StringBuffer类主要用于频繁修改字符串的操作上。但是在任何开发中,面对字符串的操作,大部分情况下都先考虑 String类,只有在需要频繁修改时才会考虑使用 StringBufferStringBuilder类操作。

*

通过以上两个类的定义结构可以发现, String 类与 StringBuffer 类都是 CharSequence 接口的子类,也就证明 StringStringBuffer类的对象都可以利用自动向上转型的操作为 CharSequence 接口实例化。

1.2 特征

StringBuffer类是Java中一个被广泛使用的可变字符串类。它提供了许多方法来操作和修改字符串内容,而不会创建新的对象实例。

以下是StringBuffer类的一些重要特点:

  • 可变性:StringBuffer对象是可变的,意味着可以通过调用相应的方法对其内容进行修改,而不会创建新的对象。相比之下,String对象是不可变的,一旦创建后就无法更改;
  • 线程安全:StringBuffer类是线程安全的,这意味着它的方法在多线程环境中可以安全地使用,不会导致竞态条件或数据不一致的问题。然而,由于其需要额外的同步开销,这可能会影响性能。如果不需要线程安全的操作,可以使用非线程安全的兄弟类StringBuilder,它具有相似的功能但性能更高;
  • 性能考虑:由于字符串是可变的,可以在执行一系列操作后一次性获取最终结果,避免了频繁的字符串拷贝和内存分配,因此在某些情况下,StringBuffer比使用+或concat()操作符连接字符串更高效。

1.3 使用

以下是StringBuffer类的一些用法:

  • 字符串操作:StringBuffer类提供了一系列方法来操作字符串,如添加字符、插入字符、替换字符、删除字符等。这些方法可以根据需要灵活地修改字符串内容;
  • 连接字符串:StringBuffer类也可以用于高效地连接字符串,而不像String那样每次连接都创建一个新的字符串对象。append()方法用于在当前字符串末尾添加字符、字符串和其他数据类型的值;
  • 反转字符串:StringBuffer类提供了reverse()方法,用于反转当前字符串的顺序。这对于需要逆序处理字符串的场景很有用。

下面是一个使用StringBuffer类的使用示例:

//	范例 2: StringBuffer类的使用
public static void main(String[] args) {
   
     
        // 创建一个空的StringBuffer对象
        StringBuffer sb = new StringBuffer();

        // 在末尾添加字符串
        sb.append("Hello");
        sb.append(" World!");

        // 输出:Hello World!
        System.out.println(sb.toString());

        // 在指定位置插入字符串
        sb.insert(5, "Java ");
        System.out.println(sb.toString());

        // 反转字符串
        sb.reverse();
        System.out.println(sb.toString());
    }

输出结果:

Hello World!
HelloJava  World!
!dlroW  avaJolleH

总之,StringBuffer类是处理可变字符串的强大工具,特别适用于需要经常修改字符串内容的场景。并且它的方法是线程安全的,可以在多线程环境中安全地使用,不会导致竞态条件或数据不一致的问题。但由于其需要额外的同步开销,也同时会影响一些性能。

2️⃣ StringBuilder类

2.1 概念及特征

StringBuilder 是 Java 中的一个类,它允许可变长度的字符串操作。与 String 类不同,StringBuilder 对象的长度和内容都可以修改。这意味着可以在已存在的字符串上进行添加、删除和修改操作,而无需创建新的对象。

以下是该类的一些重要特性:

  • 可变性:StringBuilder 具有可变性,这意味着可以动态地更改字符串内容和长度;
  • 高效性:相对于直接使用 + 运算符连接字符串的方式,使用 StringBuilder 在性能上更高效。当需要频繁进行字符串操作时,使用 StringBuilder 可以减少系统开销。

2.2 使用

以下是该类的一些使用方法:

  • 初始化:可以通过无参构造函数创建一个空的 StringBuilder 对象,或者可以根据已存在的字符串创建对象;还可以指定初始容量创建对象。
  • append()方法:用于在当前字符串末尾附加给定的数据;
  • delete()方法:用于删除当前字符串中指定范围内的字符;
  • insert()方法:用于将给定的数据插入到当前字符串的指定位置;
  • replace():该方法用于替换当前字符串指定范围内的字符;
  • reverse():该方法用于逆转当前字符串的字符顺序;
  • toString():该方法用于将 StringBuilder 对象转换为一个普通的字符串。

下面是一个使用StringBuilder类的示例:

//	范例 3: StringBuilder类的使用
public static void main(String[] args) {
   
     
        // 创建一个空的 StringBuilder 对象
        StringBuilder sb1 = new StringBuilder();
        // 根据已存在的字符串创建 StringBuilder 对象
        StringBuilder sb2 = new StringBuilder("Hello");
        // 指定初始容量创建 StringBuilder 对象
        StringBuilder sb3 = new StringBuilder(10);

        StringBuilder sb = new StringBuilder();
        sb.append("Hello");
        sb.append("World");
        System.out.println(sb.toString());

        sb.delete(5, 10);
        System.out.println(sb.toString());

        sb.insert(5, " World");
        System.out.println(sb.toString());

        sb.replace(5, 11, " Everybody");
        System.out.println(sb.toString());

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

        String str = sb.toString();
        System.out.println(str);
    }

输出结果:

HelloWorld
Hello
Hello World
Hello Everybody
ydobyrevE olleH
ydobyrevE olleH

除了上面提到的常用方法之外,StringBuilder 还有其他一些方法可以查询和修改字符串。请参考 Java 官方文档 以获取更详尽的信息。

3️⃣ String、StringBuffer和StringBuilder的对比

String类:适用于少量的字符串不变的操作;
StringBuilder类:适用于单线程下在字符串缓冲区进行大量操作;
StringBuffer类:适用于多线程下在字符串缓冲区进行大量操作。

  • String类表示不可变的(immutable)字符串,该类是 final修饰的类,不能被继承且表示***字符串常量(字符串常量一旦声明则不可改变,而字符串对象可以改变,改变的是其内存地址的指向)***,对String修改会产生新的对象,效率低。而StringBuilder和StringBuffer均为可变字符串;
  • String类使用 + 和 concat() 方法做数据的连接操作,而在StringBuffer类和StringBuilder类中使用 append()方法进行数据连接;
  • StringBuilder是非线程安全的,不保证同步所以在性能上较高;StringBuffer是线程安全的,该类方法都使用了 synchronized 修饰,所以符合多线程操作中的安全要求。

* 本文源码下载地址

Java的String类讲解案例代码(String类使用:创建对象、比较、连接、截取、查找和替换、拆分…)

*


[* ]nbsp_nbsp 3