StringBuilder为什么比String快?
因为String用+去拼接字符串,每次都要创建新的对象,即new String。
而StringBuilder用append()方法拼接字符串,不需要创建新的对象。
所以,为什么慢?因为创建对象慢。为什么创建对象慢?因为创建对象要分配内存等等操作。如果只是创建几个对象,还好,不影响,因为基本上没什么区别。如果创建了几万个对象,就开始有影响了。
StringBuilder从始至终只有一个对象,没有创建新的对象,但是也需要分配内存。何时分配内存?就是内存不够的时候,会校验到内存不够,然后自动扩容——但是不是每次拼接都会扩容,因为扩容之后,可能拼接了很多次,但是StringBuilder刚刚扩容申请的内存仍然是够的,那么就不用扩容了,除非下次又不够了,才会继续扩容内存。
源码分析
String
上面说到String某次拼接都会创建新的对象,为什么?因为String的数据是常量,不能被改变。
既然原始字符串对象的数据不能被改变,现在又要拼接成一个新的字符串,怎么办?只能创建新的对象。
StringBuilder
参考链接
https://zhuanlan.zhihu.com/p/65628607
https://www.bilibili.com/read/cv12268169
http://www.javashuo.com/article/p-kmrdipqc-rh.html
https://juejin.cn/post/6844903842723659789#heading-6
https://www.cnblogs.com/xiaofuge/p/13689485.html