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. about future

    最近又又又重复看了 star trek 星际迷航 back to the future 1/2/3 开始想象未来是什么样子的 1. 未来的开发语言 1.1[rust] or [golang] or [ ...

  2. Java&nbsp;keytool命令说明

    Java keytool命令说明 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中 ...

  3. ge lei zi yuan

    introduction to OJ http://acdream.info/topic/101 ji suan ji he mo ban http://wenku.baidu.com/link?ur ...

  4. 微信小程序开发之带搜索记录的搜索框

    实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数 ...

  5. 下载win7/win8/win10镜像

    关于给电脑换系统,很多人会花钱去电脑店里换,或者是下载Ghost系统.但这些系统都不是微软原版的,制作者已经集成了很多常用软件或垃圾软件进去.我在这给大家介绍的是如何下载正版的Windows系统.这个 ...

  6. Ext.Net 复制GridPanel的数据

    Ext.Net 复制GridPanel的数据 2013-11-28 09:50:04|  分类: Ext.net |  标签: |举报 |字号大中小 订阅     CSS: <styletype ...

  7. SharePoint 2013 set site mailbox

    Automating Site Mailboxes in SharePoint 2013 and Exchange 2013 One of the completely new features to ...

  8. 2016年第七届蓝桥杯国赛试题(JavaA组)

    1.结果填空 (满分19分)2.结果填空 (满分35分)3.代码填空 (满分21分)4.程序设计(满分47分)5.程序设计(满分79分)6.程序设计(满分99分) 1.阶乘位数 9的阶乘等于:3628 ...

  9. cshtml 获取session值

    在 cshtml 中,我们如何获取 session 的呢? 首先我们先设置 session 值,我们一般都会在 Controller 设置 session. Session["isAdmin ...

  10. 计总与排名SUM和RANK函数

    准备一些数据: CREATE TABLE [dbo].[SalesPerformance]( ,) NOT NULL, ) NOT NULL, [OrderDate] [DATE] NULL, ,) ...