滚雪球学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编程,就像滚雪球一样,越滚越大,指数级提升。

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


目录
相关文章
|
29天前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
142 83
|
1月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
150 57
|
4天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
29天前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
56 26
|
1月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
54 8
|
1月前
|
Java Android开发
Eclipse 创建 Java 类
Eclipse 创建 Java 类
29 0
|
2天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
4天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
4天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。