滚雪球学Java(49):如何使用StringBuilder类在Java中高效地处理字符串?

简介: 【6月更文挑战第3天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

@[toc]

前言

  Java是一门广泛使用的语言,特别是在企业开发中。而在Java中,字符串(String)是常用的数据类型之一。然而,字符串是不可变的对象,每当需要修改字符串时,都需要重新创建一个新的字符串对象。这些对象的创建和销毁会消耗大量的时间和空间,尤其是字符串频繁变化的场景,如字符串拼接、循环拼接等。而StringBuilder类则可以在Java中高效地处理字符串。

摘要

  本文将介绍如何使用StringBuilder类在Java中高效地处理字符串。首先,我们会了解什么是StringBuilder,其与StringStringBuffer的异同点,并学习StringBuilder的常用方法。紧接着,我们会介绍StringBuilder的应用场景和使用技巧,包括如何合理使用容量设置、链式调用、推荐的拼接方式,以及StringBuilder在多线程环境下的安全性问题。最后,我们会通过源代码和测试用例来演示StringBuilder的使用方法,并对全文进行小结和总结。

StringBuilder类

概述

  StringBuilder是Java中用于对字符串进行修改的一个类,它是可变的对象,可以在不创建新对象的情况下对字符串进行修改。StringBuilder类继承自AbstractStringBuilder,而AbstractStringBuilder实现了CharSequence接口,包括insert、append、replace等方法,因此StringBuilder拥有了许多操作字符串的方法。

  与String不同的是,StringBuilder可以进行多次修改,而不必每次都创建新的字符串对象。StringBuilder类的修改操作都是在当前对象上进行的,因此效率更高。最后我们可以通过调用toString()方法,将StringBuilder转换成String类型。

  StringBuilderStringBuffer非常相似,它们的唯一不同是线程安全,StringBuilder是非线程安全的,而StringBuffer是线程安全的。

优缺点分析

  Java 中的 StringBuilder 类是一个可变的字符串,它允许在已有字符串对象中添加、修改和删除字符内容。相比于 String 类, StringBuilder 类的优点在于它可以在不创建新的字符串对象的情况下修改字符串,因此效率更高。这里是 StringBuilder 类的优缺点分析

优点:

  1. 可变性:StringBuilder 对象可以动态增长和缩小,能够根据需要添加或删除字符。

  2. 效率高:由于 StringBuilder 对象的可变性, 避免了频繁的创建和销毁字符串对象带来的性能消耗,因此执行效率高。

  3. 线程不安全:StringBuilder 没有实现同步方法,所以在不同线程间使用可能会出现线程安全问题。因此在多线程环境下不适合使用这个类。

    缺点:

  4. StringBuilder 对象的可变性会带来一定程度的风险,因为一旦 StringBuilder 对象被改变了,它所引用的所有对象都会发生变化。如果对字符串内容的修改需求不会导致安全性问题,那么使用 StringBuilder 会更好。

  5. StringBuilder 类没有提供字符串加密的方法,因此如果需要执行这种操作,需要引用 java.security.MessageDigest 类。

StringBuilder常用方法

append()方法

  该方法用于将指定数据添加到已有字符串后面并返回StringBuilder对象,也可以添加其他类型的数据:

package com.demo.javase.day49;

/**
 * 演示StringBuilder类
 *
 * @author bug菌
 * @version 1.0
 * @date 2023/10/12 10:38
 */
public class TestStringBuilder {
   
   

    //append()方法
    public static void testAppend() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        sb.append("world");
        System.out.println(sb);
    }

    public static void main(String[] args) {
   
   
        TestStringBuilder.testAppend();
    }
}

测试执行结果截图如下:

在这里插入图片描述

insert()方法

  该方法可以将指定数据插入到已有字符串的指定位置,并返回StringBuilder对象:

    //insert()方法
    public static void testInsert() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        sb.insert(0, "world");
        System.out.println(sb);
    }

测试执行结果截图如下:

在这里插入图片描述

delete()方法

  该方法可以删除已有字符串中的指定字符,并返回StringBuilder对象

    //delete()方法
    public static void testDelete() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        sb.delete(1, 3); // 将删除e和l字符
        System.out.println(sb);
    }

测试执行结果截图如下:
在这里插入图片描述

replace()方法

  该方法可以将已有字符串中指定子串替换成新的字符串,并返回StringBuilder对象:

    //replace()方法
    public static void testReplace() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        sb.replace(1, 3, "w"); // 将替换e和l字符为w
        System.out.println(sb);
    }

测试执行结果截图如下:

在这里插入图片描述

reverse()方法

  该方法可以将已有字符串进行翻转,并返回StringBuilder对象:

    //reverse()方法
    public static void testReverse() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello");
        sb.reverse(); // 输出olleh
        System.out.println(sb);
    }

测试执行结果截图如下:

在这里插入图片描述

应用场景和使用技巧

合理使用容量设置

  StringBuilder默认容量是16个字符,如果要添加更多的字符,StringBuilder会自动增加容量,但这个过程是会消耗时间和空间的。因此,在需要添加大量字符时,最好通过构造函数设置初始容量,以避免自动扩容。

StringBuilder sb = new StringBuilder(1024); // 设置初始容量为1024

链式调用

  由于StringBuilder的方法都返回它自己的对象,所以可以使用链式调用的方式来更加简洁的实现复杂的字符串拼接操作

    //链式调用
    public static void testMethodChaining() {
   
   
        StringBuilder sb = new StringBuilder();
        sb.append("hello").append("world").insert(0, "my "); // 实现了多个操作
        System.out.println(sb);
    }

测试执行结果截图如下:

在这里插入图片描述

推荐的拼接方式

  当需要拼接多个字符串时,可以使用StringBuilder的append方法,而不是使用"+"操作符,因为每使用一次"+"操作符,就会创建一个新的String对象。

// 推荐:
StringBuilder sb = new StringBuilder();
sb.append("hello").append("world");

// 不推荐:
String s = "hello" + "world";

StringBuilder在多线程环境下的安全性问题

  StringBuilder是非线程安全的,因为它的方法都没有进行同步操作。如果在并发环境下使用StringBuilder,可能会出现数据不一致的问题。虽然可以通过手动添加同步操作来解决这个问题,但会降低StringBuilder的执行效率。

因此,在并发环境下,最好使用StringBuffer代替StringBuilder。

源代码和测试用例

首先,我们定义一个用于拼接字符串的类:

    //定义一个用于拼接字符串的方法
    public static String concat(String... strings) {
   
   
        StringBuilder sb = new StringBuilder();
        for (String s : strings) {
   
   
            sb.append(s);
        }
        return sb.toString();
    }

然后,我们编写测试用例:

    public static void main(String[] args) {
   
   
        String str = StringBuilderDemo.concat("hello", "world");
        System.out.println(str);
    }

测试执行结果如下:

在这里插入图片描述

对比StringBuilder、String及StringBuffer异同点

相同点

  1. 都是使用字符序列存储字符串的对象。
  2. 都要在堆中为字符串对象开辟内存空间。

    不同点

  3. StringBuilder和StringBuffer都是可以修改的,而String是不可变的。

  4. StringBuffer是线程安全的而StringBuilder是非线程安全的
  5. StringBuilder相比StringBuffer,性能更为优越。因为线程安全的代价是额外的同步开销,所以StringBuilder的执行效率比StringBuffer更高。
  6. StringBuilder和StringBuffer的初始容量不同,StringBuilder默认容量为16,StringBuffer默认容量为16,StringBuffer容量不足时,自动增加50%。

小结

  本文介绍了在Java中高效处理字符串的方法:使用StringBuilder类。首先,我们了解了什么是StringBuilder,以及它与String和StringBuffer的异同点,并学习了StringBuilder的常用方法。接着,我们介绍了StringBuilder的应用场景和使用技巧,包括合理使用容量设置、链式调用、推荐的拼接方式,以及StringBuilder在多线程环境下的安全性问题。最后,我们通过源代码和测试用例演示了StringBuilder的使用方法,并对全文进行了小结和总结。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

总结

  通过本文的学习,您已经了解了如何使用StringBuilder类在Java中高效地处理字符串。在进行字符串拼接操作时,我们可以优先使用StringBuilder来替代String,从而提升程序的效率。在使用StringBuilder时,我们可以通过合理设置容量、使用链式调用以及遵循推荐的拼接方式来进一步提升程序的效率。但需要注意的是,在多线程环境中,StringBuilder是非线程安全的,因此需要谨慎使用。

☀️建议/推荐你

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。


目录
相关文章
|
8月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
350 4
|
8月前
|
IDE JavaScript Java
在Java 11中,如何处理被弃用的类或接口?
在Java 11中,如何处理被弃用的类或接口?
373 5
|
8月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
405 1
|
8月前
|
Java Go 开发工具
【Java】(8)正则表达式的使用与常用类分享
正则表达式定义了字符串的模式。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
508 1
|
8月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
324 0
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
338 0
|
安全 Java API
【Java字符串操作秘籍】StringBuffer与StringBuilder的终极对决!
【8月更文挑战第25天】在Java中处理字符串时,经常需要修改字符串,但由于`String`对象的不可变性,频繁修改会导致内存浪费和性能下降。为此,Java提供了`StringBuffer`和`StringBuilder`两个类来操作可变字符串序列。`StringBuffer`是线程安全的,适用于多线程环境,但性能略低;`StringBuilder`非线程安全,但在单线程环境中性能更优。两者基本用法相似,通过`append`等方法构建和修改字符串。
377 1
|
API C# 开发者
WPF图形绘制大师指南:GDI+与Direct2D完美融合,带你玩转高性能图形处理秘籍!
【8月更文挑战第31天】GDI+与Direct2D的结合为WPF图形绘制提供了强大的工具集。通过合理地使用这两种技术,开发者可以创造出性能优异且视觉效果丰富的WPF应用程序。在实际应用中,开发者应根据项目需求和技术背景,权衡利弊,选择最合适的技术方案。
1277 1
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究