2016的第一天,我决定写一篇博客来纪念这一天,希望一年好运吧。

  String|StringBuffer|StringBuilder这三者在我们学习JAVASE核心API的时候常常出来,而且大多数入门教材都扯了一大堆他们的区别,只是没有讲清楚为什么会有这些区别。

  重申一下三者的区别:

    1.String类:封装不可变字符串;

    2.StringBuilder类:封装可变字符串,并发处理,线程不安全,一般来说处理速度最快;

    3.StringBuffer类:封装可变字符串,同步处理,线程安全,一般来说处理速度慢于StringBuilder类。

  下面就这些特性从码源角度来分析为什么会这样。

  1.String类:封装不可变字符串 

public final class String implements java.io.Serializable, Comparable<String>, CharSequence  

  String类底层是由char数组实现的,而char数组在String类中的码源为: private final char value[]; 也就是说String类的对象本质是不可变字符数组,因此我们不能改变String对象的内容。然而String类对象的引用变量如果没有final修饰则是可以改变其存储的地址值的,即引用变量指向的对象可以改变。

  补充:final修饰变量就是指变量中储存的内容不能够被修改。如果是基本数据类型变量,存的是数据内容;如果是引用类型变量,存的是对象地址。当然这两者本质上是统一的,即均为变量的内容,只不过引用变量的内容就是地址值(注:变量本质上就是JVM开辟的内存空间,一个放数据的地方)

  2.StringBuilder类

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence

  StringBuffer类继承了AbstractStringBuilder类,AbstractStringBuilder类 abstract class AbstractStringBuilder implements Appendable, CharSequence 中关于char数组声明为 char value[]; 因此这个数组内容是可变的,即StringBuilder类封装的是不可变字符串。且AbstractStringBuilder声明了Appendable接口,因此其实现类均必须实现append()方法。当然AbstractStringBuilder类还有replace()、insert()、delete()等非抽象方法,实现类继承即可以使用。

  StringBuilder采用并发编程,而并发编程会导致一个内容同时会被多个线程访问,显然速度会比StringBuffer快,不过这显然是不安全的。想想如果你卡里有1000块,你从ATM机和手机同时取1000,如果是并发处理,那么你将得到2个1000元(前提是你真的是同时处理的),显然这是不安全的嘛,人家银行就亏惨了。而这里的从ATM机取和从手机取就是两个线程,而且StringBuilder分开拿当然要比StringBuffer一起拿速度快。

  3.StringBuffer类

 public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence

  StringBuffer同样也是继承了AbstractStringBuilder类,因此与StringBuilder类一样是有append()、replace()、insert()、delete()等方法,以及关于char数组的声明。简而言之,StringBuffer类和StringBuilder类在大致方向上是一致的。但是StringBuffer的方法都加了"同步锁",即都用了synchronized修饰。因此StringBuffer类:封装不可变字符串,同步处理,线程安全,速度慢于StringBuilder类就很好理解了。

  

  从上面的分析,大致可以知道:

  1)String str;的str引用变量可以指向不同的对象,是由于对象实现的char数组加了final修饰词缘故,而不是str前面有final(如果这样,str不能指向不同对象)

  2)StringBuffer和StringBuilder师出同门。但是StringBuffer是线程安全的,而StringBuilder是线程不安全的。

  

  

String | StringBuffer | StringBuilder 比较的更多相关文章

  1. java中 String StringBuffer StringBuilder的区别

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

  2. String,StringBuffer,StringBuilder的区别

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

  3. 关于String StringBuffer StringBuilder

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

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

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

  5. Java学习笔记--String StringBuffer StringBuilder

    String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...

  6. String StringBuffer StringBuilder (转)

    转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...

  7. 【Java基础】String StringBuffer StringBuilder

    String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...

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

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

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

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

  10. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

随机推荐

  1. 搭建Node+NPM+Grunt+Ruby开发环境

    序 最近尝试了一下CoffeeScript,和Sass,不得不说这两个搭配起来的确是不错的选择,熟悉以后基本上开发就比较快速了. 当然要开发这个首先需要搭建环境,这里就需要有Node.NPM.Grun ...

  2. LeafLet之气泡框隐藏"x"图标

    例子:var marker.bindPopup( "我是一个图标的文本", { minWidth: 300 }).openPopup();L.Popup Constructor(函 ...

  3. C# FileStream分块读取和保存文件

    一 FileStream分块读取文件 public byte[] GetFileData(string fileName, long startPosition, long length) { byt ...

  4. QTreeWidget笔记

    1.QTreeWidget继承自QTreeView. 2.头文件:QTreeWidget 3.简单使用: #include "mainwindow.h" #include < ...

  5. 通过bed文件获取fasta序列

    一.BED 文件格式 BED 文件格式提供了一种灵活的方式来定义的数据行,以用来描述注释的信息.BED行有3个必须的列和9个额外可选的列. 每行的数据格式要求一致. 必须包含的3列: 1.chrom, ...

  6. linux下安装mysql的三种方法:rpm包安装、yum安装、源码包安装

    1 安装MySQL数据库服务器安装方法一://查询系统自带的数据库rpm -qa | grep -i mysql //卸载查询到的所有mysqlrpm -e --nodeps mysql-libs-5 ...

  7. JavaScript操作服务器控件之Gridview控件

    1.JavaScript脚本如下: <script language="javascript" type="text/javascript">    ...

  8. 51nod1241(连续上升子序列)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1241 题意:中文题诶- 思路:通过观察我们不难发现就是找连续 ...

  9. appium自动化测试框架——在python脚本中执行dos命令

    一般我们运行dos命令,会有两种需求,一种是需要收集执行结果,如ip.device等:一种是不需要收集结果,如杀死或开启某个服务. 对应的在python中就要封装两种方法,来分别实现这两种需求. 1. ...

  10. tableview中用动画效果改变cell的高度

    我们要的效果大概就是如下效果: 当我们选择一个cell的时候,我们就要改变它的高度,并且以动画的形式. 我们该如何实现这个效果呢?我们主要需要使用以下这两个方法: - (CGFloat)tableVi ...