首先平常在java中进行简单字符串拼接在一起最简单的方法就是 使用 "+",对与初学者是最简单的,但是随着写程序的增多,对代码的要求质量增高,发现使用 "+"的效率是非常低的,甚至我们应该不使用这种方式去拼接字符串,进行简单的例子进行说明一下。
首先准备一点测试代码:
public class Test {
public static void main(String[] args) {
String s = "";
long starMs=System.currentTimeMillis();
s =s+1;
s= s+2;
long endMs=System.currentTimeMillis();
System.out.println(endMs-starMs);
/*StringBuilder ss = new StringBuilder("");
long starMs1=System.currentTimeMillis();
ss.append(1);
ss.append(2);
long endMs1=System.currentTimeMillis();
System.out.println(endMs1-starMs1);*/
}
}
简单运行一下之后使用javap进行查看编译之后的字节码源码,如图:
我们发现在编译的过程 "+" 被编译成了StringBuilde对象进行的操作,但是我们又发现我们拼接了2次就创建了2个StringBuilder对象,显然不是我们想要的结果,我们要的是只产生一个对象,而不是拼接几次创建几个对象。
我们运行第二段StringBuilder拼接的代码,结果如图:
结果如图所示,我们清楚的看到拼接的过程值产生了一个StringBuilder对象,正是我们想要的结果,这一点就比每次创建一个对象效率高了许多,我们加大拼接的次数会怎么样呢,我们测试一下.
代码简单修改:
public class Test {
public static void main(String[] args) {
String s = "";
long starMs=System.currentTimeMillis();
for(int i=0;i<10000;i++){
s+=1;
}
long endMs=System.currentTimeMillis();
System.out.println(endMs-starMs);
StringBuilder ss = new StringBuilder("");
long starMs1=System.currentTimeMillis();
for(int i=0;i<10000;i++){
ss.append(i);
}
long endMs1=System.currentTimeMillis();
System.out.println(endMs1-starMs1);
}
}
很明显的是时间的长短,使用 "+"号,无疑创建了多个StringBuilder对象,执行完之后还要进行回收,无疑大大降低了效率。
堆的效果图:
以上只是个人观点。