String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。
因为String的底层使用Char字符实现的 而Char是用final类型修饰的,不可更改,所以是线程安全的
String str = “hello”
此时str 指向 常量池中的"hello"
这时 会在常量池开辟一块内存存储 “hello” 字符串
当执行
str=str+“word!”
此时str会切断与"hello"之间的引用 指向 “hellow word!”
当有其他引用指向"hello"的时候hello就不会被回收 ,否则当GC发现后就会回收该内存
会在常量池中开辟一块内存存储"word" 然后再开辟一块内存存储拼接后的"hello word!" 且这时str会指向"hello word!" ,而且会切断str与"hello"之间的引用,当未被引用的"hello"被GC检测到就会被回收。
为了应对经常性的字符串操作谷歌引入了StringBuffer字符串变量、StringBuilder字符串变量
StringBuffer和StringBuilder append修改字符串时
当我们对字符串进行修改的时候,推荐使用StringBuffer 和 StringBuilder
这两个能够被多次修改,且不创建新的对象,这两个方法之间的区别就是StringBuilder是线程不安全的,但StringBuilder效率更高,所以在无需考虑线程安全的时候就使用StringBuilder,如果需要考虑线程安全,则必须使用StringBuffer。
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。