java中String、StringBuffer、StringBuilder附源码

相同点:

三者底层都是采用的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();
原创文章 86 获赞 50 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qizhi666/article/details/105406813