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

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开始分析。 html

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

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更迅速。 ide

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

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

【本文仅容许注明原文连接和原做者的转载。】

相关文章
相关标签/搜索