三者都是用来对字符串进行操做,String一般用来定义一个变量,而StringBuilder StringBuffer则一般用来对字符串进行拼接等操做。但其实String一样的能够用来拼接字符串,可咱们为何不多使用呢,这样从三者的底层代码提及。数组
String的底层代码为一个用final修饰的char数组,这意味着定义一个String变量之后,该变量的内容是不可变的。安全
StringBuilder 与StringBuffer都继承自AbstractStringBuilder,该类的char数组并无用final修饰,内容是可变的,这个是什么意思呢。jvm
好比:ui
String s1= "a";spa
String s2 = new String("b") ;3d
String s3 = s1+s2;对象
若是这样,咱们获得“ab”这个字符串,由于String底层未不可变的字符串,因此会建立三个对象,都会占用内存,而这三个对象一直都未失去引用,因此jvm没法垃圾回收,形成内存资源的大量浪费,这在咱们开发中是不推崇的,而StringBuilder 与StringBuffer则不存在这样的问题。blog
经过底层代码咱们能够看到StringBuilder 与StringBuffer在拼接字符串时,经过判断字符串长度是否足够,从而建立一个新的数组用来封装数据,而原来的对象被放弃引用,等待垃圾回收,从而减小内存的浪费,所以在拼接字符串等操做时,咱们一般使用StringBuilder 与StringBuffer,但二者在执行效率上又有不一样,StringBuilder的执行效率较高,这是为何呢?继承
经过底层源码,能够发现StringBuffer在拼接字符串时,使用了同步锁,安全性提升,而StringBuilder未使用同步锁,故效率提升。内存