相同点:
三者底层都是采用的char[](char 数组)及逆行存储。
String
下图来自于:JDK8中String类的源码
StringBuffer
下图来自于:JDK8中StringBuffer类的源码。
StringBuilder
下图来自于:JDK8中StringBuilder类的源码。
通过发现,我们能看出StringBuilder和StringBuffer他们都继承于同一个父类AbstractStringBuilder,且他们底层实现都采用char[]
String Vs StringBuilder和StringBuffer
1.String是不可变的字符数组
2.StringBuilder和StringBuffer是可变的字符数组。
理由:
看上面的图片可以发现String的底层数组是final的,代表是常量,而其他两个的底层数组不是final的。
StringBuilder Vs StringBuffer
相同点:扩容方式
如果要添加的数据底层数组盛不下了,那么就需要扩容底层的数组默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中,如果扩容后依旧盛不下,那么就将底层字符数组的长度扩容到添加字符数组的长度。
不同点:
1.线程是否安全:
StringBufferr是线程安全的,而StringBuilder是线程不安全的。
下图为StringBuffer,图片来自于JDK8中StringBuffer的源码。
下图为StringBuilder,图片来自于JDK8中StringBuilder的源码。
2.效率:
因为StringBufferr是线程安全的,所以效率相对较低,因为而StringBuilder是线程不安全的,所以效率较高。
3.诞生时期:
StringBuffer是在JDK1.0的时候就有,而StringBuilder在JDK5.0的时候添加上去的。
三者如何转换:
String–>StringBuffer、StringBuilder
调用StringBuffer、StringBuilder的构造器
//String-->StringBuilder、StringBuffer
String str="hello";
StringBuilder stringBuilder= new StringBuilder(str);
StringBuffer stringBuffer=new StringBuffer(str);
StringBuffer、StringBuilder–>String
方式一:
调用String的构造器。
方式二:
调用StringBuffer、StringBuilder的toString()方法。
//StringBuffer-->String
StringBuffer stringBuffer = new StringBuffer("abc");
String s1 = new String(stringBuffer);
String s2=stringBuffer.toString();
//StringBuilder-->String
StringBuilder stringBuilder = new StringBuilder("abc");
String s3 = new String(stringBuilder);
String s4 = stringBuilder.toString();