11.string,stringbuilder,stringbuffer的区别和联系。
这三个类都是用来处理字符串的类,但是它们之间有一些区别和联系。
- 从指向内存区域变不变来分,通俗点就是字符串的可不可变性
- 线程安全与效率方面
从指向内存区域变不变来分,通俗点就是字符串的可不可变性
1.string创建对象的时候,例如string str=“xx”
其str指向的内存区域存储的xx是不能变的,如果此时你想改变str值,使str值变成xin这个字符串,也就是str=“xin”。
此时str开辟了新的内存区域存储xin,str不再指向xx的内存首地址,而是指向了xin这个内存的首地址,长度为3。
而stringbuffer与stringbuilder则可以直接将xx内存区域的值变成xin,大小从2变成3。
所以可变性与不可变性两者一对比就出来了。
线程安全与效率方面
string由于只能指向一个内存区域,所以是有线程安全性的。
stringbuffer从历史发展上看相比stringbuilder有点老了,如果stringbuffer是1.0那么stringbuilder就是1.5。所以两者功能上没啥差别。
就是刚开始jdk作者创建stringbuffer的时候为了线程安全考虑,过于谨慎,把stringbuffer的方法全用Schychronized修饰了导致stringbuffer效率过低,后来jdk作者认为大多数时候不需要线程安全的,所以就创造出了专门在单线程情况下运行的stringbuilder使的其效率大大增强。