string对象是不可变得,查看JDK文档就会发现,string中的每一个看起来修改字符串的方法,其实都是创建了一个新的string对象。
正是因为string是一个不可变的量,所以才有了以下几个优点:
1、只有当字符串不可变时,所以多线程中使用是安全的
2、只有当字符串是不可变的,字符串池才有可能实现。字符串池的实现可以在运行时节约很多heap空间,因为不同的字符串变量都指向池中的同一个字符串。
3、如果字符串是可变的话可能会造成很大的安全问题
stringbuilder和stringbuffer主要区别是在于stringbuffer是线程安全的而stringbuilder是线程不安全的,
正是因为这个区别决定了他们不同的使用场景
相较于stringbuffer而言,stringbuilder在速度上优于stringbuffer,所以大多数场景下stringbuilder的使用率更高,但是由于stringbuilder的线程不安全所以stringbuilder更适用于单线程下操作字符串缓冲区下的大量数据
三者应用场景总结如下:
string适用于操作少量数据。
stringbuffer线程安全 适用于多线程下操作字符串缓冲区下的大量数据
stringbuilder:线程不安全适用于单线程下操作字符串缓冲区下的大量数据。
三者之间的区别如下:
string 不可变字符串
stringbuffer 可变字符串 线程安全 效率低
stringbuilder 可变字符串 线程不安全 效率高
如有不对之处,请多多指教,谢谢!