为何阿里巴巴Java开发手册中不建议在循环体中使用跟进行字符串拼接


这篇文章给大家介绍为何阿里巴巴Java开发手册中不建议在循环体中使用跟进行字符串拼接,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下:那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率如何吧(JDK版本为 jdk1.8.0_201)。执行结果如下:为什么这两种方法的时间会差这么多呢?接下来让我们一起进一步研究。从字节码层面 香港云主机来看下,为什么循环体中字符串拼接 StringBuilder 比 + 快这么多?使用 javac StringConcatDemo.java 命令编译源文件,使用 javap -c StringConcatDemo 命令查看字节码文件的内容。其中 addMethod() 方法的字节码如下:可以看出,第 8 行到第 38 行构成了一个循环体:在第 8 行的时候做条件判断,如果不满足循环条件,则跳转到 41 行。编译器做了一定程度的优化,在 11 行 new 了一个 StringBuilder 对象,然后再 19 行、23 行、28 行进行了三次 append() 方法的调用,不过每次循环都会重新 new 一个 StringBuilder 对象。再来看 stringBuilderMethod() 方法的字节码:13 行到 30 行构成了循环体,可以看出,在第4行(循环体外)就构建好了 StringBuilder 对象,然后再循环体内只进行 append() 方法的调用。由此可以看出,在 for 循环中,使用 + 进行字符串拼接,每次都是 new 了一个 StringBuilder,然后再把 String 转成 StringBuilder,再进行 append,而频繁的新建对象不仅要耗费很多时间,还会造成内存资源的浪费。这就从字节码层面解释了为什么不建议在循环体内使用 + 去进行字符串的拼接。接下来再来让我们看下使用 + 或者 StringBuilder 拼接字符串的原理吧。在 Java 开发中,最简单常用的字符串拼接方法就是直接使用 + 来完成:反编译后的内容如下:(使用的反编译工具为 jad)通过查看反编译以后的代码,可以发现,在字符串常量在拼接过程中,是将 String 转成了 StringBuilder 后,使用其 append() 方法进行处理的。那么也就是说,Java中的 + 对字符串的拼接,其实现原理是使用 StringBuilder 的 append() 来实现的,使用 + 拼接字符串,其实只是 Java 提供的一个语法糖。StringBuilder 的 append 方法就是第二个常用的字符串拼接姿势了。和 String 类类似,StringBuilder 类也封装了一个字符数组,定义如下:与 String 不同的是,它并不是 final 的,所以是可以修改的。另外,与 String 不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下:其 append() 方法源码如下:该类继承了 AbstractStringBuilder 类,看下其 append() 方法:首先判断拼接的字符串 str 是不是 null,如果是,调用 appendNull() 方法进行处理,appendNull() 方法的源码如下:如果字符串 str 不为 null,则判断拼接后的字符数组长度是否超过当前数组长度,如果超过,则调用 Arrays.copyOf() 方法进行扩容并复制,ensureCapacityInternal() 方法的源码如下:最后,将拼接的字符串 str 复制到目标数组 value 中。关于为何阿里巴巴Java开发手册中不建议在循环体中使用跟进行字符串拼接就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: Git简单实用操作步骤及命令

本篇内容主要讲解“Git简单实用操作步骤及命令”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Git简单实用操作步骤及命令”吧!# 提前准备工作:1️⃣:安装Git for Windows/MacWindows下的G…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 08/11 09:53
Next 08/11 09:53

相关推荐