文档章节

【翻译】Java中String, StringBuffer, StringBuilder的区别

YuanyuanL
 YuanyuanL
发布于 2014/09/03 16:21
字数 2053
阅读 419
收藏 37

String 是  Java 中最重要的类之一,并且任何刚开始做Java编程的人,都会 用String定义一些内容,然后通过著名的 System.out.println() 语句来打印 出来。 然而,很多Java新手都不会意识到  String在Java中是 不可变的(immutable) 并且最终的(final) 的   并且每次对String结果的调整都会创建一个新的String对象。所以我们会问, 如何在Java中操作字符串又能避免创建String垃圾呢?  对于这个问题 StringBuilder 和  StringBuffer 就是答案。 StringBuffer是一个老的类,而 StringBuilder是在Java5中新加入的,并且StringBuilder 有了新的改进,主要像是   Enum Generics varargs methods  和  Autoboxing in Java 。不管你是做何种应用,你都会发现应用中使用可大量的Java String类。 但是如果你切实地分析了你的应用,你将会发现由于程序中创建了大量的临时String因此产生了了大量的垃圾。在这个  Java 向导  中我们会看到在Java中 String到是什么 , Java中String的一些重要属性, 在Java 中 StringBuffer 是真么  , 在Java 中什么时候使用  StringBuffer Java 中的  StringBuilder 以及它是如何能替代  StringBuffer 的,    在Java中 什么才是 String 和 StringBuffer 和 StringBuilder 的差别 ?哪个才是  最常见的Java核心问题    以及  String ,StringBuilder , StringBuffer 三者的主要对比差异? 现在我们从 String开始分析。

Java中String, StringBuffer 和 StringBuilder的区别

Java中的String

在找String 和 StringBuffer 或 StringBuilder 之间的差异之前,我们先来看一下Java中 String类的一些基础属性。
1) 在Java中String是非可变的(immutable):  String在Java中是有意设计成非可变的,您可以通过查看 该文章 找到原因。不变性(Immutability)为String类带来许多优势,比如:它的hashcode值可以缓存,这可以使他成为一个更快的 hashmap 键值, 并且成为 为何 String 是在HashMap中式一个流行的键的原因之一。 因为String是最终的(final),它可以在多个线程之间安全的共享,而不需要任何多余的同步
2)当我们通过双引号来表示字符串时,就像"abcd" ,我们称之为字符串常量(String literal),这些字符串常量在字符串池(String pools)中创建。 当你使用等号“==”来 比较两个字符串常量 ,如果返回值是true那是因为他们是String类的相同实例。不过,在Java中用等号来比较两个对象并不是好的做法,而是应该使用 equals方法 来检查是否相等。 
3) "+"操作对于String来说是 重载(overloaded) ,用来连接两个字符串。在内部, "+" 加操作实际上是通过 StringBuffer欧哲 StringBuilder 来实现的。
4) String字符串是通过字符数组备份的并且以UTF-16的格式来表示。 顺便说一下这可能会引起String的内存泄露(memory leak),因为相同的字符数组在源String和SubString之间是共享的,这会阻碍源String的被垃圾回收。请参阅 How SubString是如何在Java中工作的 来获取更相信的信息。 
5) String类重写了equals() 和 hashcode() 方法,两个String字符串,如果包含相同顺序的相同字符并且大小写情况也一样,那么这两个字符串就认为相等。如果想要忽略大小写情况来比较两个字符串可以考虑使用equalsIgnoreCase()方法。请参考 如何在Java中准确地重写equals方法  来了解更多关于equals 方法的最佳实践。另一个值得关注的点是,对于String来说equals 方法必须与 compareTo()方法一致,因为在Java中SortedSet 和 SortedMap ,比如: TreeMap,使用 compareTo 方法 来比较 String。 
7) toString()方法为所有对象提供了String表示,该方法在对象类中声明,并推荐给其他的类来实现该方法并提供String表示( representation)。
8) String 在Java中用UTF-16格式表示。 
9) 在Java中你可以创建 String 通过char数组, byte数组, 其他字符串,通过StringBuffer或者通过StringBuilder。 Java的String类为所有这些情况提供了构造方法。 

Java中String的问题

Java中String的一个最大优势--不可变性( Immutability )---也是它最大的问题,如果不正确使用的话。很多时候我们创建一个String字符串之后会执行很多操作,比如:将字符串转换成大写,小写,获取其子字符串(substring) ,与其他字符串连接等等。尽管String是一个不可变的类,每当一个新的String创建,旧的String就被丢弃,这样以来就在堆(heap)中 创建了大量的临时垃圾。如果String通过字符串常量来创建的,那么它们会依然保留在字符串池中(String pool)。为了解决这个问题,Java为我们提供了两个类: StringBuffer 和 StringBuilder。StringBuffer 是一个老的类,而 StringBuilder 相对来说较新,实在 JDK 5中新添的类。 

Java中String 和 StringBuffer 的差异

String 和 StringBuffer的最大区别是:String是不可变的,而 StringBuffer 是可变的,这即意味着  StringBuffer对象创建以后还能够被更改并且与此同时不需要创建新的对象。这个可变的属性使得 StringBuffer 成为Java中处理字符串的一个理想选择。 你可以通过toString()方法将StringBuffer转化成String。 String与StringBuffer的对比或者StringBuffer与String的区别是电话面试或者首轮面试中 流行的Java面试题 之一。现如今,对比中加入了StringBuilder,问题成了对比String和StringBuffer和StringBuilder的区别。 所以要准备好,下一节我们来讲Java中StringBuffer 和 StringBuilder 的区别。 

Java中 StringBuilder 和 StringBuffer 的差异

StringBuffer  在可变字符串方面表现的很好,但是它有一个缺点是:它的所有公共方法都是 同步化的,这使得它是 线程安全的(thread-safe) ,但同时效率也低了。在JDK 5中提供了类似的Java类,叫做 StringBuilder, 它是StringBuffer的副本但是去掉了同步性。 尽可能的尝试使用 StringBuilder 吧,在大多数情况下它都比 StringBuffer 类表现的更好。你也可以使用 "+" 来联接两个字符串,因为在Java中 "+" 操作在内部是通过 StringBuffer 或者 StringBuilder来实现的。如果你对比查看 StringBuilder 和 ringBuffer ,你将会发现他们两个基本相同,在Java中所有适用于 StringBuffer的API方法,也适用于StringBuilder 。换个角度来说: String和StringBuffer是完全不同的并且他们的API也完全不同,这种对比结果对于StringBuilder 和 String也同样适用


总结

在此总结Java中StringBuffer, String 和 StringBuilder的区别如下 :


1) String 是不可变的,而 StringBuffer 和 StringBuilder 是可变的对象。

2) StringBuffer 是 同步的(synchronized而 StringBuilder不能同步,这也使得 StringBuilder 比 StringBuffer更迅速。

3) 联接操作符 "+" 在内部是通过StringBuffer或者StringBuilder来实现的。

4) 在Java中,如果你需要 不可变性(immutability)那么请使用String, 如果你需要可变性以及线程安全(thread-safety)请使用Stringbuffer, 如果你需要可变性而不需要线程安全(thread-safety)那么请使用 StringBuilder。

以上就是所有关于 String 和  StringBuffer 和  StringBuilder 的讨论。所有的这些差异有助于避免很多情况下使用了String来代替StringBuffer的常规的编码错误。从Java5以后,在Java中联接字符串,可以使用 + 操作符或者 StringBuilder 。


英文原文:  http://javarevisited.blogspot.com/2011/07/string-vs-stringbuffer-vs-stringbuilder.html

【本文仅允许注明原文链接和原作者的转载。】

© 著作权归作者所有

YuanyuanL

YuanyuanL

粉丝 153
博文 325
码字总数 190992
作品 0
济南
部门经理
私信 提问
加载中

评论(4)

YuanyuanL
YuanyuanL

引用来自“孤单时会想你”的评论

3) 联接操作符 "+" 在内不 错别字。。内部
谢谢~
YuanyuanL
YuanyuanL

引用来自“孤单时会想你”的评论

3) 联接操作符 "+" 在内不 错别字。。内部
好的 果断改~
孤单时会想你
孤单时会想你
3) 联接操作符 "+" 在内不 错别字。。内部
孤单时会想你
孤单时会想你
3) 联接操作符 "+" 在内不 错别字。。内部
(转)StringBuilder与StringBuffer和String 的区别

很多人对String和StringBuffer的区别已经很了解了吧,可能还有人对这两个类的工作原理有些不清楚的地方,复习一下吧,顺便牵出J2SE 5.0(文档)里面带来的一个新的字符操作的类StringBuilder...

王振威
2012/03/08
0
1
Java反转字符串的10种方法(代码段)

本文由ImportNew -唐尤华 翻译自dzone。欢迎加入翻译小组。转载请见文末要求。 在这篇文章中,我们会讨论10种用Java反转字符串的方法,通过10个Java程序反转字符串。例如,把字符串“javagui...

ImportNew
2018/11/21
0
0
String、StringBuilder、StringBuffer 用法比较

String、StringBuilder、StringBuffer 三个类源自JDK的 java/lang/ 目录下: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全,JDK 5.0(1.5.0...

长平狐
2013/01/06
119
0
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
03/05
0
0
String ,  StringBuffer ,  StringBuilder的区别

String , StringBuffer , StringBuilder的区别 String 首先,String 是用来表示一个字符串常量的,它是一个不可变对象,意味着,一旦我们创建了某个字符串之后,就不能再改变它的值了,我们可...

tsmyk0715
2018/10/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Jenkins系列_插件安装及报错处理

进入Jenkins之后我们可以进行插件的安装,插件管理位于以下模块: 发现上面报了一堆错误,是因为插件的依赖没有安装好,那么这一节,就先把这些错误解决掉吧。解决完成后,也就基本会使用插件...

shzwork
今天
2
0
mysql mysql的所有查询语句和聚合函数(整理一下,忘记了可以随时看看)

查询所有字段 select * from 表名; 查询自定字段 select 字段名 from 表名; 查询指定数据 select * from 表名 where 条件; 带关键字IN的查询 select * from 表名 where 条件 [not] in(元素...

edison_kwok
昨天
9
0
多线程同时加载缓存实现

import com.google.common.cache.Cache;import com.google.common.cache.CacheBuilder;import java.util.concurrent.ExecutionException;import java.util.concurrent.ExecutorServi......

暗中观察
昨天
3
0
利用VisualVM 内存查看

准备工作,建几个测试类。等下就是要查看这几个类里面的属性 package visualvm;public class MultiObject { private String str; private int i; MultiObject(String str...

冷基
昨天
2
0
组装一台工作游戏两用机

一、配置清单如下: 分类 项目 价格(元) 主板 华硕(ASUS)TUF Z370-PLUS GAMING II 电竞特工 Z370二代 支持9代CPU 1049 CPU 英特尔(Intel) i7 8700K 酷睿六核 盒装CPU处理器 2640 风扇 九...

mbzhong
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部