String,StringBuffer,StringBuilder的区别
在java基础面试时基本都会问到这三者的区别,String 和StringBuffer、StringBuilder的区别主要是String不可变,因此对String进行改变后相当于又形成了一个新的变量,而StringBuffer和StringBuilder则是在原有的变量基础上进行修改。所以在基本运用中,String一般用来定义一个变量,而StringBuffer和StringBuilder用来拼接字符串。
从底层实现源码上来剖析一下这三者的区别:
String
String是一个用final修饰的char行数组,这说明String是不可变的对象。如果用String去做字符串的拼接,则需要去创建新的对象,而原有对象一直未失去引用,因此无法被jvm进行回收,所以会占用大量内存,在java开发中并不建议这样使用。
StringBuffer,StringBuilder
StringBuffer和StringBuilder都是继承AbsractStringBuilder,而AbsractStringBuilder定义的char型数组并未用final进行修饰,所以内容是可变的。
通过代码我们可以看到StringBuilder 与StringBuffer在拼接字符串时,首先判断字符串长度是否足够,从而创建一个新的数组用来封装数据,而原来的对象被放弃引用,等待垃圾回收,从而减少内存的浪费,因此在拼接字符串等操作时,我们通常使用StringBuilder 与StringBuffer。
StringBuffer和StringBuilder的区别
StringBuffer使用了同步锁,用于多线程,而StringBuilder在单线程中建议使用,从速度上来讲,StringBuilder>StringBuffer。