Java连接符“+“字符的探讨

it2023-02-04  63

在深入分析String类这篇博客中,有提到StringBuilder对象。可能有人就来疑问了,为什么字符串的连接会有StringBuilder对象的出现。

一、不同语言下的字符串连接

C语言连接字符串 相信大家都学过C语言。在C语言中,字符串是如何连接的。

char *strcat(char *dest,const char *src);

使用strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。

#include <stdio.h> #include <string.h> int main () { char str[80]; strcpy (str,"123"); strcat (str,"456"); strcat (str,"789"); puts (str); return 0; }

Java连接字符串 那在Java中是用什么连接字符串的。大家肯定经常用到,对,那就是"+"。请看下面的程序示例

但是,运算符"+"是如何连接字符串的呢?。其实,当使用“+”对字符串进行连接时,会创建一个临时的StringBuilder对象,该对象调用append方法负责字符串的连接操作,然后再调用StringBuilder类的toString方法转换成String对象。在程序的第七行可以认为是这样的代码。 后面的也是这样处理的: 输出的结果 当在一条语句中使用多个“+”来连接字符串时,会调用append方法按照从左至右的顺序追加

二、"+"连接的性能问题

如果只是简单几个字符串的连接,使用“+”运算符是非常方便的,但是,如果是在循环中反复执行String对象的连接操作,则这个开销还是不小的,因为每次循环都会创建一个临时StringBuilder对象,进行String对象连接后,再调用toString方法转换为String对象。因而,当在循环中反复执行String对象连接时,建议直接使用StringBuilder来代替“+”的连接。这样可以省去每次系统创建StringBuilder类的开销。

其中,System类的nanoTime方法返回从某个时间开始所经历的纳秒数,这个时间可以是过去,也可以是未来。如果是未来,则返回负数值。因此,该方法不是系统时钟,但是可以用来计算所经历的时间长度。根据计算机配置的不同,程序运行结果也会不同。在同一台计算机上,每次运行的结果也可能会不同。

+连接字符串时间:139197300 StringBuilder连接字符串时间:230700

非常明显,循环10000次,"+"运算符连接String对象需要,约139毫秒,而StringBuilder追加String对象,然后通过toString转换成String类型后,只需要约0.2毫秒。

总结:

当使用运算符"+"来连接字符串时,实际上是临时创建的StringBuilder对象来辅助完成的。如果是在循环中对String对象进行连接,应该直接使用StringBuilder代替String的"+"连接,这样可以提高性能
最新回复(0)