在Java中字符串是一个常用的东西,而其一个常用的操作是字符串的拼接,Java对此提供了一种非常直观的操作方式——即 + 操作符
1 | String str0 = "a"; |
如上的程序片段就实现了一个字符串的拼接,可以看到整个描述非常简洁,一目了然。学习Java的时候,这是接触到的第一种拼接字符串的方式,先入为主的印象会让你在以后需要拼接字符串时第一时间想到它,但是,你会听到大家都说:拼接大量的字符串时使用StringBuilder更好,这是为什么呢?
让我们看看编译器是怎么处理 + 操作符的。下面是上一个程序片段编译后的字节码指令:
1 | public static void main(java.lang.String[]); |
通过阅读这段字节码,可以发现,我们的+拼接操作实际上被编译器理解成了这个样子:
1 | String str0 = "a"; |
中间多出来了一个StringBuilder对象,这是一个临时对象。
假设我们现在有这样一段程序片段:
1 | String str0 = "a"; |
再来看看编译后的字节码:
1 | public static void main(java.lang.String[]); |
5~35是我们的循环体,在循环体里面,每次拼接都会生成一个StringBuilder的临时对象,那么这个程序片段执行下去就会产生10000个StringBuilder的临时对象,这10000个临时对象都是必要的吗?显然不是,我们可以在循环体外直接创建一个StringBuilder对象,然后在循环体中通过append方法拼接字符串,这样就省下了创建并回收10000个临时对象的消耗。所以,在需要拼接大量字符串时,还是使用StringBuilder对象为好。
补充:从 JDK 1.5 开始,带有字符串变量的连接操作(+),JVM 内部采用的是 StringBuilder 来实现的,而之前这个操作是采用 StringBuffer 实现的。