浅析String、StringBuffer、StringBuilder的区别以及性能区别
前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,StringBuffer、StringBuilder调用的是appende()方法,而String很特别,是采用“+”号的方式。
说明:如果想要搞的很清楚,建议去看看源码,写的比较清晰,并且自己测试几次。
先看测试结果:
| 测试次数 | String(毫秒) | StringBuffer(毫秒 | StringBuilder(毫秒 |
| 1万次 | 69 | 1 | 1 |
| 10万次 | 5822 | 2 | 1 |
| 20万次 | 22165 | 5 | 3 |
| 30万次 | 53970 | 8 | 5 |
| 50万次 | 186168 | 12 | 10 |
结论:String > StringBuffer > StringBuilder(结果仅仅是针对我自己的这台电脑,只具有一定参考意义,并不保证完全正确)
结果跟JDK的设计理念是一致的,当然了,本来就应该是这样的结果。
事实上: 1.StringBuffer和StringBuilder的区别仅仅在线程安全上面,JDK源码里面显示StringBuffer的append有synchronized关键字,而StringBuilder没有,所以StringBuffer的性能肯定是弱于StringBuilder的。
2.String和StringBuffer的差异在于,String在做字符串拼接的时候有大量的new StringBuilder操作,这对于JVM来说创建对象的开销其实是很大的,这里是性能弱点1;String内部依然是采用StringBuilder来实现的,String对象是final的,于是加上前面的很多new操作,变产生了很多垃圾,垃圾回收的开销会增加,这是性能弱点2;其实虽然说字符串操作最终都调用的是系统本地复制数组的操作,但是在调用本地方法之前String的开销很大,主要体现在String做任何操作的数组都是固定的,只能靠复制数组来解决拼接问题,所以性能是比较弱的,而StringBuffer和StringBuilder有扩容机制,也就是源码里面的扩容方法,见下面代码。
void expandCapacity(int minimumCapacity) {
int newCapacity = (value.length + 1) * 2;
if (newCapacity < 0) {
newCapacity = Integer.MAX_VALUE;
} else if (minimumCapacity > newCapacity) {
newCapacity = minimumCapacity;
}
value = Arrays.copyOf(value, newCapacity);
}
这里再补充一点关于JDK的扩容问题,其实StringBuffer和集合框架的扩容都设计得很好,当新增的长度大过了默认扩展容量的时候,他就把新增的长度作为基长度,之后的扩容也是基于这个基容量来扩展。如果不是这样,那如果一次性加入一万个元素,那么会扩展非常多次,这对性能的影响那是相当的大。
以上是个人理解:仅供参考,如果有什么错误,欢迎兄弟们提出来,大家一起研究,一起进步。
浅析String、StringBuffer、StringBuilder的区别以及性能区别的更多相关文章
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 转:String StringBuffer StringBuilder区别
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?
Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...
- 关于String StringBuffer StringBuilder
0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...
随机推荐
- Android标签云控件:TagCloudLinkView
可以完成添加.删除.选择操作的标签控件,可以自定样式(颜色等),可删除的标签末尾带有'×'符号.和Android-Cloud-TagView-Plus(见正文相关代码)类似. 1.layout in ...
- axis2 WebService的发布与调用
1:准备: JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk6downloads-1902814.html e ...
- jquery实现"跳到底部","回到顶部"效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [CC]CC插件初探
应用程序插件框架的内容包括:主程序App,插件Plugin. 1.实现一个应用程序插架框架关键点有: 一个插件的标准接口,在主程序中存在一个插件的集合.主程序通过循环读取每个插件,将插件对象通过多态的 ...
- 如何调试DLL组件
因为DLL组件不像EXE是程序的入口,所以DLL需要其他进程的调用才能调试. 1.首先在DLL项目中你想调试的位置打好断点. 2.如果已经有一个进程,比如foo.exe已经启动,那么就用:调试> ...
- (Protype Pattern)原型模式
定义: 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象 适用性: 当我们系统中有一些类,在使用的时候都有同样需要大量的创建,而这样的创建是复杂的而且是浪费CPU,内存资源的 ...
- 3n+1问题
猜想: 对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半. 经过若干次这样的变换,一定会使n变为1.例如3->10->5->16->8->2-& ...
- 实验十四_访问CMOS RAM
编程:以"年/月/日 时:分:秒"的格式,显示当前的日期,时间. 注意:CMOS RAM中存储着系统的配置信息,除了保存时间信息的单元外,不要向其他的单元写入内容,否则将引起一些系 ...
- Swift动画编程指南-02 Swift动画是怎么炼成的
上一节我们看了几个很棒的例子,我们不禁会想.他们是怎么设计的,怎么从一个空白的画布变成一个完整的,美丽的动画.这些动画是如何产生的,是哪些属性被改变了.我们还要认真思考的是,每一个步骤到底发生了什么. ...
- PostgreSQL中initdb做了什么
在使用数据库前,是启动数据库,启动数据库前是initdb(初始化数据库):一起来看一下initdb做了什么吧. 初始化数据库的操作为: ./initdb -D /usr/local/pgsql/dat ...