stringbuilder与stringbuffer

总结:
1、 StringBuilder 性能好,适合改变字符串的,而对于String它是值不变的,每次+都是新建一个对象

1
2
3
4
5
6
7
8
9
StringBuilder sb = new StirngBuilder();
sb.append("a").append("b").append("c").append("d");


String str = "";
str += "a";
str += "b";
str += "c";
str += "d";

StringBuilder直到最后sb.toString()才会创建String对象,之前都没有创建新对象,但是如果你append的总长度超过一定范围——默认是16——就会创建一个新的数组,来装下更多的String。

String对象一旦创建就是不能被改变的,要达到字符串拼接的效果,就得不停创建新对象,而创建新的对象时,有可能会触发GC。

  1. StringBuilderStringBuffer,字符串是存放在char[]中的,char[]是存放在堆中的。都是继承于AbstractStringBuilder,唯一的区别就是StringBuffer的函数上都有synchronized关键字。

  2. StringBuffer是线程安全的,StringBuilder不是线程安全的。

  3. 扩容的性能代价是很严重的,双倍扩容+2。合理设置一个初始值多重要。使用之前先仔细评估一下要保存的字符串最大长度

  4. StringBuilder是非线程安全的,所以不能在多线程环境下共享使用。StringBuilder在使用的时候一定要指定其初始大小,另外,对性能要求比较高的场景下,可以考虑用一个ThreadLocal 缓存可重用的StringBuilder。