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 ...
随机推荐
- <正则吃饺子> :关于Collections中 比较器的简单使用
在线文档地址: http://tool.oschina.net/apidocs/apidoc?api=jdk-zh sort public static <T extends Comparabl ...
- [nyoj737]石子归并(区间dp入门题)
题意:有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值 ...
- pig ERROR 2997: Encountered IOException. File or directory null does not exist.
grunt> ls 2014-03-30 19:58:31,344 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 2997: Enc ...
- 转:isualvm远程监控Tomcat
一.Java VisualVM 概述 对于使用命令行远程监控jvm 太麻烦 . 在jdk1.6 中 Oracle 提供了一个新的可视化的. JVM 监控工具 Java VisualVM .jvisua ...
- 《Java多线程编程核心技术》读后感(九)
当interrupt方法遇到wait方法 当线程呈wait()状态时,调用线程对象的interrupt()会出现InterruptedException异常 package Third; public ...
- 安装Matlab出现Error 1935错误解决方法
1.开始 - 运行(输入regedit.exe)- 确定或者回车,打开注册表编辑器: 2.在打开的注册表编辑器中找到:HKEY_LOCAL_MACHINE ,并展开:HKEY_LOCAL_MACHIN ...
- NativeScript官方书籍:1.为什么选择nativescript
1.为什么选择nativescript 本章介绍 什么是NativeScript nativescript对于移动开发世界意味着什么 NativeScript工作原理 在早期的移动应用程序(前iPho ...
- HDU - 2571 命运 DP倍数跳跃处理
命运 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中 ...
- Kolla多节点环境安装OVN
安装OVN组件 控制节点 ### 安装ovn-northd # wget https://copr.fedorainfracloud.org/coprs/leifmadsen/ovs-master/r ...
- 【NOIP模拟赛】密码锁
题目描述 hzwer有一把密码锁,由N个开关组成.一开始的时候,所有开关都是关上的.当且仅当开关x1,x2,x3,…xk为开,其他开关为关时,密码锁才会打开. 他可以进行M种的操作,每种操作有一个si ...