String|String,StringBuffer,StringBuilder的详解以及源码具体分析
之前也是对这仨个一知半解,所以也是看了好多的资料,希望能够给自己也给需要的人有帮助。
对String,StringBuilder,StringBuffer的有一个大体的了解
1.String Java的一个对象,值是不可变的,每次创建的时候都会生成新的String对象。至于为什么说他不可变呢,其实在根本意义上:所谓的不可改变是指每次都创建了新的内存,而原来的数据依然存储在内存中。
文章图片
2.StringBuilder 是线程不安全的。线程不安全的
3.StringBuffer是线程安全的
好啦,基于上面的初步了解,下面就具体分析一下哈。
一、String
我们说他不可变,但是他就为什么不可变呢,其实我们通过String的源码发现,他的类定义为final的,并且里面又封装了final 修饰的char[]数组。final修饰的变量一旦创建就不可以改变且子类不可以继承,而且他无论是concat还是sub操作都是重新创建了一个新的对象。
文章图片
源码分析
文章图片
concat源码 通过String的“concat”源码我们可以看出来的是每次连接都是创建了一个新的char[]数组
二、StringBuffer
StringBuffer,是一个线程安全,且支持修改的一个对象,但是他为什么是线程安全的呢,话不多说上源码。
文章图片
StringBuffer部分源码 果然任何事情都逃不过的真香定理,在StringBuffer的类中所有重现的方法我们发现都是存在“synchronized”修饰符的,众所周知这个关键字是在多线程访问的时候起到保护作用的,(线程的问题,请看下回分解),所以StringBuffer当然是线程安全的啦。
我们就那insert操作来看一下他的源码吧
文章图片
StringBuffer的insert操作
我们通过源码发现StringBuffer,StringBuilder都会有append()、delete()、insert()这三个方法,而String中没有这些方法,通过上述的StringBuffer的源码我们可以分析得出结果,insert操作的时候都是调用了arraycopy方法将目标数组复制到新的数组当中去。
三、StringBuilder
文章图片
StringBuilder的insert源码分析
通过源码分析,我们发现StringBuilder是没有Sychronized关键字的,所以他是非线程安全的。
对于StringBuffer,StringBuilder,String运行速度的分析
String
String对象是不可改变的,所以每次对String对象改变的时候,等同于创建了一个新的String对象,指针会重新指向这个对象,而垃圾内存变多了以后,jvm的GC进程就会重新进行垃圾回收。
1.如果要操作少量的数据用 String ,这性能影响也不大。
2.如果单线程下操作大量数据用 StringBuilder,单线程不用考虑线程安全问题,且这个速度快。
【String|String,StringBuffer,StringBuilder的详解以及源码具体分析】3.如果是多线程操作字符串缓冲区下操作大量数据用 StringBuffer,速度稍慢点,但安全保障。
推荐阅读
- jvm关于String
- LeetCode(03)Longest|LeetCode(03)Longest Substring Without Repeating Characters
- 026-Catagory-NSString
- 使用NSAttributedString富文本踩到的坑
- String个人总结
- convert|convert string to BST[deserialize 基础]
- gorm缺陷
- 常用的一些时间格式
- 一个关于String的疑问
- 11-转为布尔类型