加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

发布时间:2019-02-14 03:40:22 所属栏目:优化 来源:Hollis
导读:副标题#e# 本文,也是对于Java中字符串相关知识的一个补充,主要来介绍一下字符串拼接相关的知识。本文基于jdk1.8.0_181。 一、字符串拼接 字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起。 我们都知道,String是Java中一个

和String类类似,StringBuilder类也封装了一个字符数组,定义如下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

与String不同的是,它并不是final的,所以他是可以修改的。另外,与String不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

其append源码如下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

该类继承了AbstractStringBuilder类,看下其append方法:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,会进行扩展。

StringBuffer和StringBuilder类似,最大的区别就是StringBuffer是线程安全的,看一下StringBuffer的append方法。

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

该方法使用synchronized进行声明,说明是一个线程安全的方法。而StringBuilder则不是线程安全的。

五、StringUtils.join是如何实现的

通过查看StringUtils.join的源代码,我们可以发现,其实他也是通过StringBuilder来实现的。

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

六、效率比较

既然有这么多种字符串拼接的方法,那么到底哪一种效率最高呢?我们来简单对比一下。

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

我们使用形如以上形式的代码,分别测试下五种字符串拼接代码的运行时间。得到结果如下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

从结果可以看出,用时从短到长的对比是:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

StringBuffer在StringBuilder的基础上,做了同步处理,所以在耗时上会相对多一些,这个很好理解。

StringUtils.join也是使用了StringBuilder,并且其中还是有很多其他操作,所以耗时较长,这个也容易理解。其实StringUtils.join更擅长处理字符串数组或者列表的拼接。

那么问题来了,前面我们分析过,其实使用+拼接字符串的实现原理也是使用的StringBuilder,那为什么结果相差这么多,高达1000多倍呢?

我们再把以下代码反编译下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

反编译后代码如下:

为什么阿里巴巴不建议在for循环中使用+进行字符串拼接?

我们可以看到,反编译后的代码,在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。

而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。

所以,阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。而不要使用+。

七、总结

本文介绍了什么是字符串拼接,虽然字符串是不可变的,但是还是可以通过新建字符串的方式来进行字符串的拼接。

常用的字符串拼接方式有五种,分别是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。

由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。

因此,经过对比,我们发现,直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。

但是,还要强调的是:

1、如果不是在循环体中进行字符串拼接的话,直接使用+就好了。

2、如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。

【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读