滚雪球学Java(50):理解Java中String、StringBuilder和StringBuffer的区别与选择

举报
bug菌 发表于 2024/02/20 17:31:32 2024/02/20
【摘要】 🏆本文收录于「滚雪球学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和StringBuffer。虽然它们都可以用来表示字符串,但它们之间有着很大的区别和不同的使用场景。在这篇文章中,我们将深入了解这三种类,以便在实际开发中做出正确的选择。

摘要

  本文将介绍Java中的三种字符串类:String、StringBuilder和StringBuffer。我们将分别介绍它们的性能和使用场景,并且提供示例代码和测试用例。最后,我们将作出总结,以便您在实际开发中做出正确的选择。

正文

String类

  String类是Java中最基本的字符串类。它是不可变的,即一旦字符串被创建,就不能被修改。当我们尝试修改它时,实际上是在创建一个新的字符串对象。这意味着,在对字符串进行频繁的操作时,String类的效率很低。

示例代码:

String s1 = "hello";
String s2 = s1 + "world";

  在上面的代码中,我们使用了“+”运算符来连接两个字符串。这将创建一个新的字符串对象,其中包含“hello”和“world”两个字符串。

StringBuilder类

  StringBuilder类是Java中用于处理可变字符串的类。它提供了一个可变的字符序列,可以进行添加、删除和修改等操作。与String类不同的是,StringBuilder类是可变的,这意味着我们可以对同一个对象进行多次修改而不需要创建新的对象。因此,它的效率比String类高。

示例代码:

StringBuilder sb = new StringBuilder("hello");
sb.append("world");

  在上面的代码中,我们使用了StringBuilder的append()方法,将“world”添加到了字符串后面,而不会创建新的对象。

StringBuffer类

  StringBuffer类与StringBuilder类功能类似,也是Java中用于处理可变字符串的类。区别在于,StringBuffer类是线程安全的。这意味着在多线程环境中使用StringBuffer时,我们不需要担心并发问题。但是,它的效率比StringBuilder类低。

示例代码:

StringBuffer sb = new StringBuffer("hello");
sb.append("world");

  在上面的代码中,我们使用了StringBuffer的append()方法,将“world”添加到了字符串后面,而不会创建新的对象。

示例演示

  借此针对三类进行基本的使用以作为开篇介绍,如果需要对单独某个类有深入的了解,可以参考如下三篇:

如下是示例代码的全部代码,演示了String、StringBuilder和StringBuffer的用法,同学们可以再温习一遍。

package com.demo.javase.day50;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/12 11:17
 */
public class StringDemo {

    public static void main(String[] args) {
        String s = "hello";
        s = s + "world"; // 新对象
        System.out.println(s);

        StringBuilder sb = new StringBuilder("hello");
        sb.append("world"); // 相同对象
        System.out.println(sb.toString());

        StringBuffer sbf = new StringBuffer("hello");
        sbf.append("world"); // 相同对象
        System.out.println(sbf.toString());
    }
}

上述代码执行结果如下:

在这里插入图片描述

性能比较

  在实际开发中,我们需要根据需求选择不同的字符串类。下面是三种类的性能比较:

类型 是否可变 线程安全 效率
String 不可变 N/A
StringBuilder 可变 不安全
StringBuffer 可变 安全

  可以看出,如果我们需要对字符串进行频繁的操作,则应该使用StringBuilder类。如果我们在多线程环境中使用字符串,则应该使用StringBuffer类。

性能测试示例

为了验证性能比较的结果,我们编写了以下测试用例,对比10 万次字符串连接各自需要耗时多久。

package com.demo.javase.day50;

/**
 * @author bug菌
 * @version 1.0
 * @date 2023/10/12 14:33
 */
public class StringPerformanceTest {

    private static final int ITERATIONS = 100000;
    private static final String STR_TO_APPEND = "hello";

    public static void main(String[] args) {
        String string = "hello";

        long start = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            string = string + STR_TO_APPEND;
        }
        long end = System.currentTimeMillis();
        System.out.println("String time耗时: " + (end - start) + "ms");

        StringBuilder stringBuilder = new StringBuilder("hello");
        start = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            stringBuilder.append(STR_TO_APPEND);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuilder time耗时: " + (end - start) + "ms");

        StringBuffer stringBuffer = new StringBuffer("hello");
        start = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            stringBuffer.append(STR_TO_APPEND);
        }
        end = System.currentTimeMillis();
        System.out.println("StringBuffer time耗时: " + (end - start) + "ms");
    }
}

测试结果展示

如上代码执行需要耗费点时间,测试执行的小伙伴需耐心等待。

如不想等待的同学可直接参考如下执行结果:

在这里插入图片描述

测试代码分析

  这段代码测试了使用字符串拼接、StringBuilder、StringBuffer 三种方式进行字符串连接的性能差异。代码的核心是分别测试,在进行 10 万次字符串连接时,使用不同的方式所需时间的差异。其中,String 表示使用 Java 中的字符串拼接方式,StringBuilder 表示使用 StringBuilder 进行字符串连接,StringBuffer 表示使用 StringBuffer 进行字符串连接,三种方式的输出都包含所需时间的信息。

测试结论

  在 Java 中,String 对象是不可变的,每当对 String 对象进行改变时,都会创建一个新的 String 对象。因此,每次使用字符串拼接时,实际上都会创建新的 String 对象,这在循环中进行数万次会比较慢,因此性能较差。

  相比之下,StringBuilder 和 StringBuffer 通过修改其内部缓冲区来实现字符串的连接,不会在循环中创建新的对象,能够提高性能。其中,StringBuilder 是线程不安全的,但速度更快;而StringBuffer 是线程安全的,但速度相对较慢。

  因此,使用 StringBuilder 进行字符串连接是更好的选择,能够获得更好的性能表现。

小结

  在Java中,我们可以使用String、StringBuilder和StringBuffer处理字符串。String类是不可变的,每次操作都会创建新的对象,效率较低。StringBuilder类是可变的,可以对同一个对象进行多次操作,效率较高。StringBuffer类也是可变的,但是线程安全,适用于多线程环境。在实际开发中,我们需要根据需求选择不同类型的字符串类。为了获得更好的性能,我们应该尽可能使用StringBuilder类。

附录源码

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

总结

  在Java中,字符串是最常见的数据类型之一。理解String、StringBuilder和StringBuffer的区别和选择非常重要。本文介绍了三种类的性能和使用场景,并提供了示例代码和测试用例。希望您能在实际开发中做出正确的选择。

☀️建议/推荐你


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

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

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

  我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。