String,StringBuffer,StringBuilder的详解以及源码具体分析

之前也是对这仨个一知半解,所以也是看了好多的资料,希望能够给自己也给需要的人有帮助。

对String,StringBuilder,StringBuffer的有一个大体的了解

1.String Java的一个对象,值是不可变的,每次创建的时候都会生成新的String对象。至于为什么说他不可变呢,其实在根本意义上:所谓的不可改变是指每次都创建了新的内存,而原来的数据依然存储在内存中。

String,StringBuffer,StringBuilder的详解以及源码具体分析_第1张图片

2.StringBuilder 是线程不安全的。线程不安全的

3.StringBuffer是线程安全的

好啦,基于上面的初步了解,下面就具体分析一下哈。

一、String

我们说他不可变,但是他就为什么不可变呢,其实我们通过String的源码发现,他的类定义为final的,并且里面又封装了final 修饰的char[]数组。final修饰的变量一旦创建就不可以改变且子类不可以继承,而且他无论是concat还是sub操作都是重新创建了一个新的对象。

String,StringBuffer,StringBuilder的详解以及源码具体分析_第2张图片
源码分析
String,StringBuffer,StringBuilder的详解以及源码具体分析_第3张图片
concat源码

通过String的“concat”源码我们可以看出来的是每次连接都是创建了一个新的char[]数组

二、StringBuffer

StringBuffer,是一个线程安全,且支持修改的一个对象,但是他为什么是线程安全的呢,话不多说上源码。

String,StringBuffer,StringBuilder的详解以及源码具体分析_第4张图片
StringBuffer部分源码

果然任何事情都逃不过的真香定理,在StringBuffer的类中所有重现的方法我们发现都是存在“synchronized”修饰符的,众所周知这个关键字是在多线程访问的时候起到保护作用的,(线程的问题,请看下回分解),所以StringBuffer当然是线程安全的啦。

我们就那insert操作来看一下他的源码吧

String,StringBuffer,StringBuilder的详解以及源码具体分析_第5张图片
StringBuffer的insert操作

我们通过源码发现StringBuffer,StringBuilder都会有append()、delete()、insert()这三个方法,而String中没有这些方法,通过上述的StringBuffer的源码我们可以分析得出结果,insert操作的时候都是调用了arraycopy方法将目标数组复制到新的数组当中去。

三、StringBuilder

String,StringBuffer,StringBuilder的详解以及源码具体分析_第6张图片
StringBuilder的insert源码分析

通过源码分析,我们发现StringBuilder是没有Sychronized关键字的,所以他是非线程安全的。

对于StringBuffer,StringBuilder,String运行速度的分析

String

String对象是不可改变的,所以每次对String对象改变的时候,等同于创建了一个新的String对象,指针会重新指向这个对象,而垃圾内存变多了以后,jvm的GC进程就会重新进行垃圾回收。

1.如果要操作少量的数据用 String ,这性能影响也不大。

2.如果单线程下操作大量数据用 StringBuilder,单线程不用考虑线程安全问题,且这个速度快。

3.如果是多线程操作字符串缓冲区下操作大量数据用 StringBuffer,速度稍慢点,但安全保障。

你可能感兴趣的:(String,StringBuffer,StringBuilder的详解以及源码具体分析)