张小飞的Java之路——第二十七章——StringBuilder

本文详细介绍了Java中的StringBuilder与StringBuffer的区别,重点讨论了StringBuilder的高效性能,并揭示了在不同JDK版本中,静态字符串相加、变量相加以及循环相加时的优化策略,包括JDK9及之后版本的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


1. StringBuilder

张小飞:StringBuilder是什么?

诸小亮:StringBuilder 跟 StringBuffer 的用法一样,但是效率稍微高一些

张小飞:哦?这是为什么?

诸小亮:你看看下面的测试结果

public static void main(String[] args) throws Exception {
    //获取当前时间的毫秒值
    long l = System.currentTimeMillis();
	StringBuffer str = new StringBuffer();//使用StringBuffer,append 一千万次
    for(int i = 0;i<10000000;i++){
        str.append(i);
    }
    System.out.println(System.currentTimeMillis() - l);
}

结果:1672918808422.png


public static void main(String[] args) throws Exception {
    //获取当前时间的毫秒值
    long l = System.currentTimeMillis();
	StringBuilder str = new StringBuilder();//使用StringBuilder,append 一千万次
    for(int i = 0;i<10000000;i++){
        str.append(i);
    }
    System.out.println(System.currentTimeMillis() - l);
}

结果:1672918734008.png

张小飞:明白了,不过既然用法一样,为什么搞两个类呢?只用StringBuilder不就行了

诸小亮:问得好,这是因为 StringBuffer 是在早期的JDK版本种就推出了,而 StringBuilder 是JDK5 才推出的

张小飞:原来是这样,那为什么 StringBuilder 效率要高呢?

诸小亮:因为他们两个是有区别的

  • StringBuffer:是线程同步的,多线程操作是安全的
  • StringBuilder:非线程同步,多线程操作不安全,但是单线程下效率高于StringBuffer

张小飞:StringBuffer 是线程安全的?

诸小亮:是的,因为StringBuffer所有方法都是同步方法

image.png

张小飞:原来如此,就是因为同步,导致 StringBuffer 效率相对来说比 StringBuilder 低一些

诸小亮:是的,不过因为在 JDK 1.6 ,synchronized 进行了升级,所以它们的差别现在很小

2. 优化

张小飞:您之前说,两个 String 之间,用 + 连接时,进行了一些优化,什么样子的优化?

诸小亮:一共分 3 种,我们一个个看

1. 静态字符串相加

诸小亮:静态字符串相加,比如:
image.png
在编译为 class 文件时,就已经做了优化

张小飞:什么样子的优化?

诸小亮:双击打开 class 文件,就可以看到效果了

image.png

张小飞:明白了

2. 变量相加的优化

张小飞:那么第二种呢?

诸小亮:第二种是变量相加,比如:

image.png

张小飞:这种是???

诸小亮:在JDK5——JDK8的时候,会创建一个 StringBuilder 对象,相当于

String s2 = new StringBuilder(s).append("貂蝉").append("吕布").toString();

张小飞:原来如此,明白了

诸小亮:但是 JDK9 的时又进行了修改,使用 StringConcatFactory 的 makeConcatWithConstants 方法

张小飞:这个进行了怎样的优化?

诸小亮:这个。。。,很抱歉,目前并不知道它是如何优化的,暂时作为了解吧

张小飞:好吧,那我们现在是 JDK11 还有优化?

诸小亮:没有了,JDK11 跟 JDK9 一样

3. 循环相加

张小飞:第三种呢?

诸小亮:其实第三种跟第二种类似

image.png
张小飞:您的意思是,s2 += i,也是用了StringBuilder对象?,相当于

String s2 = new StringBuilder(s).append("i");

诸小亮:没错,你领悟的还挺快

张小飞:哈哈,不过,这样不是每一次循环都会创建一个 StringBuilder 对象吗?

诸小亮:是的,所以遇到这种情况,还是建议在 for 循环的外面创建一个 StringBuilder 对象

张小飞:明白了

诸小亮:另外,JDK9之后,这种也是使用 StringConcatFactory 的 makeConcatWithConstants 方法

张小飞:了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值