前奏: 比较三者之间的区别在与区别他们做相同的事情的时候的区别,那就是在我们常见的拼接字符串的时候,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的区别以及性能区别的更多相关文章

  1. final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?

    继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...

  2. 转:String StringBuffer StringBuilder区别

    转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...

  3. String&StringBuffer&StringBuilder区别

    String  String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式:    (1)直接赋值(例中,String str = &q ...

  4. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  5. String,StringBuffer,StringBuilder的区别

    public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...

  6. [置顶] String StringBuffer StringBuilder的区别剖析

    这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...

  7. String,StringBuffer,StringBuilder的区别及其源码分析

    String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...

  8. Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?

    Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系 创建成功的String对象,其长度是固定的,内容 ...

  9. 关于String StringBuffer StringBuilder

    0. String对象的创建       1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...

随机推荐

  1. 简单的apk Ionic

    index.html <html> <head> <meta charset="utf-8"> <meta name="view ...

  2. 第五篇 Replication:事务复制-How it works

    本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...

  3. 将hadoop源代码导入eclipse

    1. 安装JDK,eclipse,下载hadoop源代码并解压到某一个目录. 2. 安装maven,将bin目录添加到PATH环境变量中. 3. 安装protobuf2.5.0,将protoc-2.5 ...

  4. PLSQL 的简单命令之二

    --1. 查询工资大于12000的员工姓名和工资 --2. 查询员工号为176的员工的姓名和部门号 ' --3. 选择工资不在5000到12000的员工的姓名和工资 --4. 选择雇用时间在1998- ...

  5. [gerrit] Auto Add Reviewer When Push Code

    1. ${PROJECT_ROOT}/.git/config 加入如下代码 [remote "review"] url = ssh://${username}@codeserver ...

  6. centos Flash Player插件的安装

    关于Flash Player插件的安装,其实Fedora官方Wiki文档已经给出了详细的说明,我这里再把重点提取一下: 1. 首先到Adobe Flash Plugin官方下载页面选择YUM for ...

  7. Lintcode: Update Bits

    Given two 32-bit numbers, N and M, and two bit positions, i and j. Write a method to set all bits be ...

  8. SQL 数据库备、还,附、分,数据查询,聚合函数

    认识数据库备份和事务日志备份 数据库备份与日志备份是数据库维护的日常工作,备份的目的是在于当数据库出现故障或者遭到破坏时可以根据备份的数据库及事务日志文件还原到最近的时间点将损失降到最低点. 数据库备 ...

  9. 基于Qt Phonon模块实现音乐播放器

    这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐 ...

  10. poj: 3094

    简单题 #include <iostream> #include <stdio.h> #include <string> #include <stack> ...