String

String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:
String、StringBuffer、StringBuilder - 图1

我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费

StringBuffer与StringBuilder

String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuffer 线程安全StringBuilder 线程不安全,为什么呢,看看底层实现就能知道StringBuffer 的.append()synchronized关键字修饰,而StringBuilder的没有。(确实应该有空特别是摸鱼时候多看看源码~)

image.png
image.png

然后这样也会导致StringBuffer 相应耗费多一点时间,可以参考
https://www.cnblogs.com/dolphin0520/p/3778589.html

额,所以,推荐在单线程环境使用StringBuilder,多线程则使用StringBuffer !