一 代码
/*
体会执行效率:通过 StringBuilder 的 append() 的方式添加字符串的效率要远高于使用 String 的字符串拼接方式!
① StringBuilder的append()的方式:自始至终中只创建过一个 StringBuilder 的对象。
使用 String 的字符串拼接方式:创建过多个 StringBuilder 和 String 的对象
② 使用 String 的字符串拼接方式:内存中由于创建了较多的 StringBuilder 和 String 的对象,内存占用更大;如果进行GC,需要花费额外的时间。
改进的空间:在实际开发中,如果基本确定要前前后后添加的字符串长度不高于某个限定值 highLevel 的情况下,建议使用构造器实例化:
StringBuilder s = new StringBuilder(highLevel); // new char[highLevel]
*/
@Test
public void test6() {
long start = System.currentTimeMillis();
method1(100000); // 6159
//method2(100000); // 4
long end = System.currentTimeMillis();
System.out.println("花费的时间为:" + (end - start));
}
// 使用 String 的 + 进行字符串拼接
public void method1(int highLevel) {
String src = "";
for (int i = 0; i < highLevel; i++) {
src = src + "a"; // 每次循环都会创建一个 StringBuilder、String
}
// System.out.println(src);
}
// 使用 StringBuilder 的 append 方法进行拼接
public void method2(int highLevel) {
// 只需要创建一个 StringBuilder
StringBuilder src = new StringBuilder();
for (int i = 0; i < highLevel; i++) {
src.append("a");
}
// System.out.println(src);
}
二 测试
method1 耗费的时间:6159 ms,method2 消耗时间:4ms
三 结论
通过 StringBuilder 的 append() 方式添加字符串的效率,要远远高于 String 的字符串拼接方法。
四 性能分析
-
StringBuilder 的 append 的方式,自始至终只创建一个 StringBuilder 的对象。不论从空间角度还是时间角度考虑,都是一个好的解决方案。
-
对于字符串拼接(+)的方式,需要创建很多 StringBuilder 对象和调用 toString 时候创建的 String 对象。内存中由于创建了较多的 StringBuilder 和 String 对象,内存占用过大,如果进行 GC 那么将会耗费更多的时间。不论从空间角度还是时间角度考虑,String 都是一个糟糕的解决方案。
五 改进的空间
-
如果使用的是 StringBuilder 的空参构造器,默认的字符串容量是16,然后将原来的字符串拷贝到新的字符串中, 我们也可以默认初始化更大的长度,减少扩容的次数。
-
因此在实际开发中,我们能够确定,前前后后需要添加的字符串不高于某个限定值,那么建议使用构造器创建一个阈值的长度。