String,StringBuffer和StringBuilder區別

在這一小節中,我們將學習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類。

上一篇: java中方法重載和方法重寫的區別 下一篇:無