【翻譯】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

【本文僅容許註明原文連接和原做者的轉載。】

相關文章
相關標籤/搜索