上代码
public static void main(String[] args) {
String s = "qwer";
StringBuilder s1=new StringBuilder("qwer");
//使用stringbuilder的效率
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
s1.append("asdf").append("zxcv").append("jkl").append("iop");
}
long endTime = System.currentTimeMillis();
//获取循环执行所用的时间
float seconds = (endTime - startTime) ;
//stringbuilder所用的时间
System.out.println(seconds);
//使用string的效率
long endTime1 = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
s = s + "asdf" + "zxcv" + "jkl" + "iop";
}
long endTime2 = System.currentTimeMillis();
//string所用的时间
float seconds2 = (endTime2 - endTime1) ;
System.out.println(seconds2);
}
执行结果对比
7.0
1502.0
Process finished with exit code 0
可以明显看出来StringBuilder比String快多了。但是快的原因是什么呢?String每次进行“+”操作,编译器是怎么执行的?
其实在string进行“+”的操作的时候 编译器会自动引入StringBuilder对象,用来构造最终的string对象。每一次“
+“操作都会产生一个新的StringBuilder对象并且为每一个字符串调用一次append()方法,最后调用tostring()来生成结果。
那么既然编译器会自动优化给我们是用StringBuilder对象,那么为什么还会存在效率差异呢?
因为如果源代码里使用StringBuilder对象,编译器只会生成一个StringBuilder对象,来进行循环的赋值操作,
而且使用StringBuilder可以显式的给声明长度,如果已经知道对象的大概长度,那么预先制定大小,还可以避免多次
重新分配缓存的问题。