遇到一个面试题:在下面的例子中用“+”运算符连接字符串与用StringBuilder对象的append方法连接字符串哪个性能比较优异。
下图是给出的例子,例一,使用“+”运算符连接字符串
例二,使用StringBuilder对象的append方法连接字符串
按照之前的经验,例一在经过java编译器编译之后,使用“+”运算符连接子符串的方式会被编译成使用StringBuilder对象append的方法。每次循环都会都会创建一个StringBuilder对象。所以使用例二的方式性能比较优异,因为例二只创建了一个StringBuilder对象。
但是我把例子中的代码修改了一下,把例子中的for循环换成while(true)。下面是我修改后的代码。
package com.belizer.String;
import java.util.Random;
/**
* Created by 47131 on 2018/2/24.
* 说明使用StringBuffer并不一定消耗的内存比使用String消耗的内存小,
* 具体情况还要具体分析
*
*/
public class Demo2 {
public static void main(String[] args) {
//fun1();//fun1不会内存溢出
//fun2();//fun2会内存溢出
//fun3();
fun4();
}
public static void fun1(){
String s="我";
while (true){
s=s+"我";
}
}
public static void fun2(){
StringBuffer sb=new StringBuffer("我");
while (true){
sb.append("我");
}
}
public static void fun3(){
String s="";
Random random=new Random();
while (true){
s=s+random.nextInt(1000)+" ";
}
}
public static void fun4(){
String s="";
Random random=new Random();
StringBuilder sb=new StringBuilder();
while (true){
sb.append(random.nextInt(1000)).append(" ");
}
}
}
注:例一对应fun3方法,例二对应fun4方法。
按照刚才的理解,fun3会在每次循环都创建一个StringBuilder对象,所以其消耗的内存会一直增加,直到内存溢出。
但是情况恰恰相反,内存溢出的fun4,也就是使用StringBuilder对象的append方法连接字符串会内存溢出。顿时懵逼了,求教。