《java基础》高效拼接字符串

为什么要写这篇文章

有没有人感觉很诧异、疑惑、不解?拼接字符串这么简单的操作,怎么能不会呢?是不是突然有种作者想水文的感觉?

我是真的冤枉啊,我要大声的为自己辩解。

在这里插入图片描述

写这篇文章的目的是为了给大家分享一个我刚工作时的真实事情。当时的项目组长说:"你拼接字符串的方式真的对吗?"当我听到组长这样问时我还愣了一下,默默的看了看自己写的代码。并没有发现有什么特别大的问题,但是介于当时我还是在新手村打怪的身份,也不敢肯定自己写的就是对的。后来事实证明我写的代码确实存在着性能问题。最近排查项目中的BUG时无意翻到了之前写的代码,从而想起了这件事情,所以才有了这篇文章。也是想把这个问题告诉大家,让一些新手少踩坑。

正文

先把有问题的代码展示出来让大家瞅瞅,看看各位能不能发现其中的问题。

public static void main(String[] args) {
    String result = "";
    for (int i = 0; i < 10000; i++) {
        result += "菜鸟";
      }
    System.out.println(result);
}

有发现什么问题吗?

其实问题就出现在使用+=拼接字符串上了,当循环次数过大,并且需要拼接的字符串过长时,使用上述方法进行拼接,效率会明显下降。当然解决方案其实也特别简单,我们只需要使用StringBuilder的append方法进行字符串的拼接就会大大提高效率。

优化之后的代码如下:

public static void main(String[] args) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < 10000; i++) {
      result.append("菜鸟");
    }
    System.out.println(result.toString());
}

为了让大家更加直观的看到两种拼接字符串方式,在效率上的差别。我将上述两段代码进行了执行时间的统计。具体是如何统计代码执行时间的,我就不在此展示了,想必大家应该也都会。如果有不太明白的,可以在评论区问我,或者翻看我之前的文章,查找相关的例子。直接看结果吧。

在这里插入图片描述

是不是发现效率还是相差很多的。有没有突然感觉学到了呢?(小小的自恋一下)

在这里插入图片描述

为什么会出现这样的现象呢?

在这里插入图片描述

其实很简单因为在java9之前使用"+"号拼接字符串,其底层使用的是StringBuilder来完成的。为了让大家了解更清楚我写了一个例子。

public static void main(String[] args) {
    String str = "Hello";
    str = str + "!";
}

上面的例子经过编译之后如下(为了看得更清楚,我只截取了一部分的代码):

在这里插入图片描述

通过上面的图片是不是一目了然?

此时我们需要考虑一个问题,当循环进行字符串拼接时,会产生大量的StringBuilder对象和String对象(最后的toString方法产生的),那么是不是会造成性能的损耗呢?答案是肯定的,频繁的创建和销毁对象会造成很多不必要的损耗,我们是需要积极避免的。

大家有没有考虑过为什么StringBuilder拼接字符串就比String快呢?

其实很简单,因为String类是被final修饰的。当一次次拼接字符串时,其内部是在创建一个个的String对象。StringBuilder就不一样了,它是一个可变对象。当创建一个StringBuilder对象后,它在堆中维护了属于自己的一块区域。当添加新的值时,也是在自己的区域中追加的(长度是可以自己扩充的),这样就会减少很多创建、销毁对象的操作,从而提高程序的效率。

看完上面的文章有没有一种恍然大悟的感觉呢?如果文章哪里写的有问题,或者有不太明白的地方,可以在评论区提问或者给我留言,我一定会尽力给大家解答。看完感觉不错的记得点赞呦。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值