String | StringBuffer | StringBuilder 比较
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 比较的更多相关文章
- 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
0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- Java学习笔记--String StringBuffer StringBuilder
String StringBuffer StringBuilder String http://docs.oracle.com/javase/7/docs/api/ 中文: http://www.cn ...
- String StringBuffer StringBuilder (转)
转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...
- 【Java基础】String StringBuffer StringBuilder
String String是不可变的 我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的.(public final class String) 查看以下代码: S ...
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 浅谈 Java 字符串(String, StringBuffer, StringBuilder)
我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...
随机推荐
- about future
最近又又又重复看了 star trek 星际迷航 back to the future 1/2/3 开始想象未来是什么样子的 1. 未来的开发语言 1.1[rust] or [golang] or [ ...
- Java keytool命令说明
Java keytool命令说明 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中 ...
- ge lei zi yuan
introduction to OJ http://acdream.info/topic/101 ji suan ji he mo ban http://wenku.baidu.com/link?ur ...
- 微信小程序开发之带搜索记录的搜索框
实现功能:点击搜索框,有搜索记录时以下拉菜单显示,点击下拉子菜单,将数据赋值到搜索框,点击搜索图标搜索,支持清空历史记录,可手动输入和清空查询关键字, UI: wxml: <!--查询历史记录数 ...
- 下载win7/win8/win10镜像
关于给电脑换系统,很多人会花钱去电脑店里换,或者是下载Ghost系统.但这些系统都不是微软原版的,制作者已经集成了很多常用软件或垃圾软件进去.我在这给大家介绍的是如何下载正版的Windows系统.这个 ...
- Ext.Net 复制GridPanel的数据
Ext.Net 复制GridPanel的数据 2013-11-28 09:50:04| 分类: Ext.net | 标签: |举报 |字号大中小 订阅 CSS: <styletype ...
- SharePoint 2013 set site mailbox
Automating Site Mailboxes in SharePoint 2013 and Exchange 2013 One of the completely new features to ...
- 2016年第七届蓝桥杯国赛试题(JavaA组)
1.结果填空 (满分19分)2.结果填空 (满分35分)3.代码填空 (满分21分)4.程序设计(满分47分)5.程序设计(满分79分)6.程序设计(满分99分) 1.阶乘位数 9的阶乘等于:3628 ...
- cshtml 获取session值
在 cshtml 中,我们如何获取 session 的呢? 首先我们先设置 session 值,我们一般都会在 Controller 设置 session. Session["isAdmin ...
- 计总与排名SUM和RANK函数
准备一些数据: CREATE TABLE [dbo].[SalesPerformance]( ,) NOT NULL, ) NOT NULL, [OrderDate] [DATE] NULL, ,) ...