String和StringBuffer、StringBuilder
String和StringBuffer、StringBuilder的区别是什么?String为什么不可变:
相同点:三者都可以存储和操作字符串
不同点:
可变性: String类使用final关键字字符数组保存字符串(private final char value[]) 所有String对象是不可变得,而StringBuffe和StringBuilder都使用字符数组保存字符串 (char[] value)但没有用final修饰,所以二者是可变的
线程安全性:String对象是不可变得,可以认为是常量,线程安全AbstractStringBuilder是StrinBuilder和StringBuffer公共父类,定义了一些字符串的基本操作, StringBuffer对方法加上了同步锁或者对调用方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
性能:每次对String类型进行修改,都会生成一个新的String对象,然后将指针指向新的String对象。StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对 象并改变对象的引用,相同情况下StringBuilder相比使用StringBuffer仅能获得10%~15%左右的性能提升,但却要冒着多线程不安全的风险
总结:
操作少量的数据(String)
单线程操作字符串缓冲区下操作大量数据(StringBuilder)
多线程操作字符串缓冲区下操作大量数据(StringBuffer)
什么情况下用“+”运算符进行字符串连接比调用StringBuffer/String Builder对象的 append 方法连接字符串性能更好?
Java 编译器将"+"编译成了 StringBuilder
字符串可以直接使用“+”进行连接,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder,
“+”和StringBuilder的运行结果是完全等效的,但二者的运行效率和消耗资源方面有很大的区别:
当连接的字符串表达式比较简单那么二者基本一样,如果字符串比较复杂(使用循环连接字符串)使用“+”消耗资源(每循环一次都会创建一个StringBuilder对象,会占用到量的资 源),直接使用StringBuilder来连接字符串就会解决上述问题。