StringBuffer类的使用方法详解:打造高效字符串操作

2023-11-21 11:09:34 浏览数 (1)


theme: healer-readable

highlight: a11y-dark


哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在Java开发中,字符串是一个重要的数据类型。字符串可以用于数据存储、传递和显示。在Java中,字符串可以用String类来表示,但是String类具有不可变性,每次修改都会创建一个新的字符串对象,这对于频繁修改字符串的操作来说效率较低。因此引入了StringBuffer类,它是可变的,可以修改字符串的内容,其效率更高。

摘要

  本文主要介绍Java中的StringBuffer类,包括该类的功能、源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。全文通过markdown语法书写,并且全文内容衔接清晰。

StringBuffer类

简介

  StringBuffer类是Java语言中的一个类,它是可变的字符串类,可以动态的改变字符串内容。它是线程安全的类,因此可以在多线程的环境中使用。

  StringBuffer的效率相比String要高,因为它可以在不创建新对象的情况下改变字符串的内容。在Java中,StringBuffer用于频繁修改字符串的操作,是一种代替String的选择。

源代码解析

  在Java中,StringBuffer类是一个final类,并且继承自AbstractStringBuilder类。StringBuffer类由以下四个关键参数组成:

代码语言:java复制
int count; char[] value; boolean shared; int[] cache; 

  其中,count是字符串的长度,value是字符数组,表示字符串的内容,shared用于判断字符数组是否是共享的,cache是一个缓存,用于提高toString()方法的执行效率。

  StringBuffer类的方法,主要分为两类:修改字符串的方法和查询字符串的方法。修改字符串的方法,包括append()、insert()、delete()、replace()等,查询字符串的方法,包括charAt()、substring()、indexOf()、lastIndexOf()等,具体的方法使用说明可见下文。

  如下是部分源码截图:

在这里插入图片描述在这里插入图片描述

应用场景案例

常规字符串拼接

  在Java开发中,常常需要对字符串进行拼接。如果使用String类的" "操作符实现字符串拼接,由于String类的不可变性,每次操作都会创建新的字符串对象,导致性能较差。而使用StringBuffer类可以在不创建新对象的情况下实现字符串拼接,因此是更好的选择。

代码语言:java复制
String s = "hello";
StringBuffer sb = new StringBuffer();
sb.append(s).append(" ").append("world");
System.out.println(sb.toString());

输出结果为:

代码语言:java复制
hello world

高效的字符替换

  如果使用String类的replace()方法进行字符串替换,每次操作都会创建新的字符串对象,效率较低。而使用StringBuffer类,可以在不创建新对象的情况下实现字符串替换。

代码语言:java复制
String s = "hello";
StringBuffer sb = new StringBuffer(s);
sb.replace(0, 1, "H");
System.out.println(sb.toString());

输出结果为:

代码语言:java复制
Hello

快速字符串倒置

  如果使用String类的reverse()方法进行字符串倒置,由于String类的不可变性,每次操作都会创建新的字符串对象,效率较低。而使用StringBuffer类,可以在不创建新对象的情况下实现字符串倒置。

代码语言:java复制
String s = "hello";
StringBuffer sb = new StringBuffer(s);
sb.reverse();
System.out.println(sb.toString());

输出结果为:

代码语言:java复制
olleh

优缺点分析

优点

  1. 可变性:StringBuffer类是可变的,可以动态改变字符串的内容。
  2. 线程安全:StringBuffer类是线程安全的,因此可以在多线程的环境中使用。
  3. 高效性:由于StringBuffer类的可变性,可以在不创建新对象的情况下修改字符串的内容,因此效率要高于不可变的String类。

缺点

  1. StringBuffer类的线程安全是通过同步机制实现的,因此在多线程操作时,效率可能会降低。
  2. 由于StringBuffer类是可变的,当频繁修改字符串内容时,可能会造成内存溢出的问题。

类代码方法介绍

以下列出StringBuffer类的常用方法:

修改字符串的方法

append()方法

在字符串末尾添加内容。

代码语言:java复制
public synchronized StringBuffer append(Object obj)
public synchronized StringBuffer append(String str)
public synchronized StringBuffer append(char[] str)
public synchronized StringBuffer append(CharSequence s)
public synchronized StringBuffer append(CharSequence s, int start, int end)
public synchronized StringBuffer append(StringBuffer sb)
public synchronized StringBuffer append(Boolean b)
public synchronized StringBuffer append(char c)
public synchronized StringBuffer append(int i)
public synchronized StringBuffer append(long lng)
public synchronized StringBuffer append(float f)
public synchronized StringBuffer append(double d)
public synchronized StringBuffer appendCodePoint(int codePoint)
insert()方法

在字符串指定位置插入内容。

代码语言:java复制
public synchronized StringBuffer insert(int offset, Object obj)
public synchronized StringBuffer insert(int offset, String str)
public synchronized StringBuffer insert(int offset, char[] str)
public StringBuffer insert(int dstOffset, CharSequence s)
public synchronized StringBuffer insert(int dstOffset, CharSequence s, int start, int end)
public synchronized StringBuffer insert(int offset, boolean b)
public synchronized StringBuffer insert(int offset, char c)
public synchronized StringBuffer insert(int offset, int i)
public StringBuffer insert(int offset, long l)
public StringBuffer insert(int offset, float f)
public StringBuffer insert(int offset, double d)
public synchronized StringBuffer insert(int offset, char[] str, int pos, int len)
public synchronized StringBuffer insert(int offset, CharSequence s)
public synchronized StringBuffer insert(int offset, CharSequence s, int start, int end)
public synchronized StringBuffer insert(int offset, String str, Object... args)
public StringBuffer insert(int offset, Object obj)

拓展:

  针对StringBuffer类中的一些插入方法,它们可以将指定的字符串、字符、布尔值、数字、对象等插入到StringBuffer对象中的指定位置。其中,参数offset表示插入的位置,str/obj表示要插入的字符串或对象,s表示CharSequence类型的对象(比如String或StringBuffer对象),start和end表示要插入CharSequence对象中的子序列的起始位置和终止位置,dstOffset表示要插入的位置,pos和len表示要插入字符数组中的子序列的起始位置和终止位置。有一些方法是同步的,这意味着在多线程环境下,它们会保证线程安全性。

delete()方法

删除字符串中的内容。

代码语言:java复制
public synchronized StringBuffer deleteCharAt(int index)
public synchronized StringBuffer delete(int start, int end)
replace()方法

替换字符串中的内容。

代码语言:java复制
public synchronized StringBuffer replace(int start, int end, String str)

拓展:

  deleteCharAt 方法用于删除指定位置上的字符,并返回被删除字符所在索引之后的字符串内容。它是线程安全的,即在多线程环境下也可以保证该方法的正确性。

  delete 方法用于删除一段字符串,其实在 StringBuffer 中,字符串是通过字符数组实现的。该方法传入的参数是需要删除的字符串的起始和终止索引,删除范围包括起始索引位置的字符,但不包括终止索引位置的字符,同样返回删除后的字符串内容。该方法也是线程安全的。

  需要注意的是,由于 StringBuffer 是可变的字符串对象,因此对该对象进行操作时需要考虑同步性,以保证多线程操作的正确性和一致性。因此,这两个方法都使用了 synchronized 关键字进行同步处理。

setCharAt()方法

设置字符串中指定位置的字符。

代码语言:java复制
public synchronized void setCharAt(int index, char ch)

拓展:

  这是一个方法声明,方法名为setCharAt,参数列表包括一个整型参数和一个字符类型参数。方法使用了synchronized关键字,表示该方法是线程安全的,可以在多线程环境下调用。

  该方法的作用是将字符串中指定位置的字符替换为指定字符。

  具体实现是利用String类中的内部字符数组,通过修改指定位置的字符来实现替换操作。由于String类的字符数组是不可变的,因此需要使用synchronized关键字来保证多线程情况下的安全性。

setLength()方法

设置字符串的长度。

代码语言:java复制
public synchronized void setLength(int newLength)

查询字符串的方法

charAt()方法

获取字符串中指定位置的字符。

代码语言:java复制
public synchronized char charAt(int index)
substring()方法

获取字符串中指定位置的子字符串。

代码语言:java复制
public synchronized String substring(int start)
public synchronized CharSequence subSequence(int start, int end)
public synchronized String substring(int start, int end)
indexOf()方法

获取字符串中指定字符或子字符串的位置。

代码语言:java复制
public synchronized int indexOf(String str)
public synchronized int indexOf(String str, int fromIndex)
public synchronized int lastIndexOf(String str)
public synchronized int lastIndexOf(String str, int fromIndex)
public synchronized int indexOf(char c)
public synchronized int indexOf(char c, int fromIndex)
length()方法

获取字符串的长度。

代码语言:java复制
public synchronized int length()
toString()方法

将字符串对象转换为字符串。

代码语言:java复制
public synchronized String toString()

拓展:

  这是一个方法声明,它被标记为synchronized,表示它是一个同步方法,只能被一个线程同时执行。该方法的返回类型是String,因此它必须返回一个字符串。方法名称是toString,这意味着它应该返回一个对象的字符串表示形式。

  此方法通常用于将对象转换为字符串,以便能够打印或显示对象的信息。在这种情况下,方法可能会访问对象的属性,并将它们格式化为字符串。

测试用例

以下是一个简单的测试用例,用于测试StringBuffer类的常用方法:

测试代码演示

代码语言:java复制
package com.example.javase.se.classes;

/**
 * @Author ms
 * @Date 2023-10-01 18:32
 */
public class StringBufferTest {

    public static void main(String[] args) {
        testAppend();
        testInsert();
        testDelete();
        testReplace();
        testSetCharAt();
        testSetLength();
        testCharAt();
        testSubstring();
        testIndexOf();
        testLength();
        testToString();
    }

    public static void testAppend() {
        StringBuffer sb = new StringBuffer();
        sb.append("hello").append(" ").append("world");
        System.out.println(sb.toString().equals("hello world"));
    }

    public static void testInsert() {
        StringBuffer sb = new StringBuffer("hello");
        sb.insert(0, "world ");
        System.out.println(sb.toString().equals("world hello"));
    }

    public static void testDelete() {
        StringBuffer sb = new StringBuffer("hello world");
        sb.delete(5, 11);
        System.out.println(sb.toString().equals("hello"));
    }

    public static void testReplace() {
        StringBuffer sb = new StringBuffer("hello world");
        sb.replace(0, 5, "hi");
        System.out.println(sb.toString().equals("hi world"));
    }

    public static void testSetCharAt() {
        StringBuffer sb = new StringBuffer("hello world");
        sb.setCharAt(0, 'H');
        System.out.println(sb.toString().equals("Hello world"));
    }

    public static void testSetLength() {
        StringBuffer sb = new StringBuffer("hello world");
        sb.setLength(5);
        System.out.println(sb.toString().equals("hello"));
    }

    public static void testCharAt() {
        StringBuffer sb = new StringBuffer("hello");
        System.out.println(sb.charAt(1) == 'e');
    }

    public static void testSubstring() {
        StringBuffer sb = new StringBuffer("hello world");
        System.out.println(sb.substring(6).equals("world"));
        System.out.println(sb.substring(3, 7).equals("lo w"));
    }

    public static void testIndexOf() {
        StringBuffer sb = new StringBuffer("hello world");
        System.out.println(sb.indexOf("world") == 6);
        System.out.println(sb.indexOf("l") == 2);
    }

    public static void testLength() {
        StringBuffer sb = new StringBuffer("hello");
        System.out.println(sb.length() == 5);
    }

    public static void testToString() {
        StringBuffer sb = new StringBuffer("hello");
        System.out.println(sb.toString().equals("hello"));
    }
}

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这段代码演示了 StringBuffer 类的常用方法,包括 append,insert,delete,replace,setCharAt,setLength,charAt,substring,indexOf,length,toString 等方法。通过调用这些方法来对 StringBuffer 对象进行字符串的拼接、插入、删除、替换、修改长度、获取字符等操作,并验证这些操作的结果是否正确。可以对这些方法进行单个或者组合使用来实现不同的功能。其中,每个方法的具体作用如下:

  • append:将字符串追加到 StringBuffer 的末尾。
  • insert:将字符串插入到 StringBuffer 的指定位置。
  • delete:从 StringBuffer 中删除指定范围的字符。
  • replace:替换 StringBuffer 中指定范围内的字符。
  • setCharAt:用指定字符替换 StringBuffer 中指定位置的字符。
  • setLength:设置 StringBuffer 的长度,可以截取或者扩展字符串。
  • charAt:返回 StringBuffer 中指定位置的字符。
  • substring:返回 StringBuffer 中指定范围的子字符串。
  • indexOf:返回 StringBuffer 中指定字符串的起始位置。
  • length:返回 StringBuffer 中字符的数量。
  • toString:将 StringBuffer 转换为字符串类型。

  通过这些方法可以快速准确地对字符串进行操作,特别是在需要频繁修改字符串内容的情况下,StringBuffer 比 String 更加高效,因为 String 本身是不可变的对象,每次修改都会生成一个新的对象,而 StringBuffer 可以在原有对象的基础上进行修改。因此,在需要频繁操作字符串的场景中,建议使用 StringBuffer 类。

小结

  本文主要介绍了Java中的StringBuffer类,包括该类的功能、源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。通过本文的介绍,我们可以了解到StringBuffer类是可变的字符串类,可以动态改变字符串内容,具有高效性和线程安全性。在Java开发中,使用StringBuffer类可以替代String类,提高字符串操作的效率。

总结

  总的来说,本文详细介绍了Java中的可变字符串类StringBuffer,包括该类的功能、源代码解析、应用场景案例、优缺点分析、类代码方法介绍以及测试用例。由于StringBuffer类具有可变性和线程安全性,因此在Java开发中,使用StringBuffer类可以替代不可变的String类,提高字符串操作的效率。对于频繁修改字符串的操作来说,使用StringBuffer类是一种较好的选择。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!

***

⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞