1. 程式人生 > >Java| String, StringBuffer和tringBuilder之間的區別?

Java| String, StringBuffer和tringBuilder之間的區別?

String是 java 程式設計中最廣泛使用的類之一,也是核心 java 面試中最重要的主題之一。 本文主要講解String 類的主要特性,然後我們將比較 String vs StringBuffer 和 StringBuilder。

String字串在 java 中是不可變的,而且是最終的,因此每當我們進行 String 操作時,就會建立一個新的 String。字串處理是一種資源消耗,所以 java 提供了兩個字串操作的實用類—— StringBuffer 和 StringBuilder。

StringBuffer 和 StringBuilder 是可變類。 Stringbuffer 操作是執行緒安全和同步的,其中 StringBuilder 操作不是執行緒安全的。

因此,當多個執行緒在同一個字串上工作時,我們應該使用StringBuffer,但在單執行緒環境中,我們應該使用 StringBuilder。 由於沒有同步開銷,StringBuilder 的效能比 StringBuffer 快。

String in Java

  • 1.String 類表示字串,我們可以用兩種方式例項化 String.
  • String str = "yveshe";或者String str = new String ("yveshe");
  • 2.在 java 中,String類時不可變類,所以很容易在不同的執行緒或函式中共享它
  • 3.當我們使用雙引號建立String字串物件時,它首先在 JVM 字串池中尋找具有相同值的 String 時,如果找到 String,它會返回引用,否則 它建立 String 物件,然後將它放置在 String 池中。 這樣 JVM 可以通過在不同的執行緒中使用相同的字串來節省大量的空間。 但是如果使用new操作符來例項化String時,它會在堆記憶體中顯式建立一個新字串物件.
  • 4.+ 運算子為 String 過載,用於連線兩個字串。 然後它在內部是使用 StringBuffer 來執行這個操作的,可以通過反編譯觀看其最終編譯結果.
  • 5.String重寫equals()和 hashCode ()方法,只有在兩個字元順序相同的情況下,兩個字串才是相等的。 注意: equals()方法是大小寫敏感的,使用 equalsIgnoreCase ()方法可以忽略大小寫敏感
  • 6.String字串是用UTF-16(Unicode的一種實現模式)格式來表示的
  • 7.String是final修飾的,除了"private int hash"之外的欄位,所有欄位都是 final 修飾。 欄位hash中用於快取 hashCode () 函式值,只在呼叫 hashCode ()方法時建立,然後在此欄位中快取。 因此對相同的String每次呼叫 hashCode ()方法,都會產生相同的輸出。 對於呼叫者來說,每次呼叫hashCode方法時都像是重新計算了hash值一樣,實際上它快取在欄位hash中,原始碼如下
    /** Cache the hash code for the string */
    private int hash; // Default to //生成String時將original的hash值快取起來 public String(String original) { this.value = original.value; this.hash = original.hash; } //使用快取的hash值,如果快取的hash值為預設值且不為空字串,則重新計算hash值 public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h; } return h; }

String VS StringBuffer

由於 String 在 java 中是不可變的,所以每當我們做 String 操作,比如 concat,substring等,它就會生成一個新的字串並丟棄舊的字串給垃圾收集器收集 這些都是繁重的操作,會產生大量的垃圾。 所以 Java 提供了 StringBuffer 和 StringBuilder 類,這些類應該用於字串的操作。 Stringbuffer 和 StringBuilder 是 java 中的可變物件,並提供字串操作的 append(), insert(), delete() and substring() 方法.

建議: 在對字串有繁重的操作時,不建議使用String,而是根據多執行緒環境使用Stringbuffer或者StringBuilder.

StringBuffer vs StringBuilder

在 Java 1.4之前,StringBuffer 是字串操作的唯一選擇,但它有一個缺點,即它的所有公共方法都是同步的。提供執行緒安全性,但需要效能成本。 在大多數場景中,我們不會在多執行緒環境中使用 String,所以 Java 1.5引入了一個新的 StringBuilder 型別,它與 StringBuffer 類似,除了執行緒安全和同步。

因此,當我們處於單執行緒環境或不關心執行緒安全,我們應該使用 StringBuilder 否則使用 StringBuffer。請參閱 StringBuffer 和 StringBuilder 之間的效能測試

String VS StringBuffer VS StringBuilder

  • 1.String 是不可變的,而 StringBuffer 和 stringbuilder 是可變類.
  • 2.StringBuffer是執行緒安全和同步的,而 StringBuilder 不是,這就是 StringBuilder 比 StringBuffer 更快的原因
  • 3.字串連線操作 + 操作符內部使用 StringBuffer 或 StringBuilder 類,解語法糖可知.
  • 4.對於非多執行緒環境中的字串操作,我們應該使用 StringBuilder 而不是使用 StringBuffer 類

總結: 比較了String 與 StringBuffer 和 StringBuilder 之間的差異。 在大多數的字串操作場景中,StringBuilder 比 StringBuffer 更適合。