String,StringBuffer和StringBuilder區別

2019-10-16 22:23:48

在這一小節中,我們將學習StringStringBufferStringBuilder之間的區別。StringBufferStringBuilder有什麼區別是一個流行的java面試問題。

本教學主要介紹String類的主要功能,然後比較StringStringBufferStringBuilder之間的區別。

1. String

  • String類表示字串,可以通過兩種方式範例化String

    String str = "abc";
    // 或者
    String str = new String ("abc");
    
  • String在Java中是不可變的,因此很容易在不同的執行緒或函式之間共用它。

  • 當使用雙引號建立String時,它首先在JVM字串池中查詢具有相同值的String,如果找到它則返回參照,否則它將建立String物件,然後將它放入String池中。這樣JVM通過在不同的執行緒中使用相同的String來節省大量空間。但是如果使用新的運算子,它會在堆記憶體中顯式建立一個新的String

  • +運算子為String過載並用於連線兩個字串。雖然在內部它使用StringBuffer來執行此操作。

  • String覆蓋equals()hashCode()方法,只有兩個字串在相同的順序中具有相同的字元時才相等。請注意,equals()方法區分大小寫,如果不查詢區分大小寫的檢查,則應使用equalsIgnoreCase()方法。

  • String表示UTF-16格式的字串。

  • String是一個final類,除了private int hash欄位之外,所有欄位都是final。此欄位包含hashCode()函式值,僅在呼叫hashCode()方法並在此欄位中快取時建立。此外,使用String類的final欄位和一些計算生成雜湊,因此每次呼叫hashCode()方法時,都會產生相同的輸出。對於呼叫者來說,它就像每次都在進行計算,但在內部它會被快取在雜湊欄位中。

2. String與StringBuffer

由於String在Java中是不可變的,因此每當執行字串操作(如連線,子字串等)時,它會生成一個新的String並丟棄舊的String以進行垃圾收集。

這些都是繁重的操作,並在堆中產生大量垃圾。所以Java提供了StringBufferStringBuilder類用於String操作。

StringBufferStringBuilder是java中的可變物件,並為String操作提供append()insert()delete()substring()方法。

3. StringBuffer 與 StringBuilder

在Java 1.4之前,StringBufferString操作的唯一選擇,但它有一個缺點,即它的所有公共方法都是同步的。StringBuffer提供執行緒安全性,但效能成本。

在大多數情況下,不在多執行緒環境中使用String,因此Java 1.5引入了一個新的類StringBuilder,類似於StringBuffer,除了執行緒安全和同步。

因此,如果處於單執行緒環境中或者不關心執行緒安全性,則應使用StringBuilder,否則請使用StringBuffer

4. String,StringBuffer與StringBuilder

  • String是不可變的,而StringBufferStringBuider是可變類。
  • StringBuffer是執行緒安全和同步的,而StringBuilder不是,因引StringBuilderStringBuffer更快。
  • String 連線 + 操作符在內部使用StringBufferStringBuilder類。
  • 對於非多執行緒環境中的String操作,應該使用StringBuilder,否則使用StringBuffer類。