【JAVA】辨析:String,StringBuffer與StringBuilder

參考連接:

1. Java String 類:字符串常量

  • 字符串普遍應用 在Java 編程中,在 Java 中字符串屬於對象,Java 提供了 String 類來建立和操做字符串。html

  • 須要注意的是,String的值是不可變的,這就致使每次對String的操做均可能生成新的String對象,這樣不只效率低下,並且大量浪費有限的內存空間。java

    • 對string從新賦值,若是字符串常量池不存在這個新的賦值對象,就會創造新的對象,若是存在,就不會建立
  • String操做時內存變化的圖:編程

2. StringBuffer 和 StringBuilder 類:字符串變量

  • 當對字符串進行修改的時候,須要使用 StringBuffer 和 StringBuilder 類。安全

  • 和 String 類不一樣的是,StringBuffer 和 StringBuilder 類的對象可以被屢次的修改,而且不產生新的未使用對象。多線程

  • StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不一樣在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。ui

  • 因爲 StringBuilder 相較於 StringBuffer 有速度優點,因此多數狀況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的狀況下,則必須使用 StringBuffer 類。.net

3. 辨析

  • 繼承結構:

  • 字符修改上的區別

    • String:不可變字符串;線程

    • StringBuffer:可變字符串、效率低、線程安全;htm

    • StringBuilder:可變字符序列、效率高、線程不安全;對象

  • 三者在執行速度方面的比較:

    • StringBuilder > StringBuffer > String
  • 初始化上的區別(大霧,其實差很少)

    • 均可以賦空值null,親測不報錯;

    • 均可以經過new的形式建立空對象,此時打印什麼都不輸出(null也不輸出)

  • 關於初始化的補充

  • 小結:

    • (1)若是要操做少許的數據用 String;

    • (2)多線程操做字符串緩衝區下操做大量數據 StringBuffer;

    • (3)單線程操做字符串緩衝區下操做大量數據 StringBuilder(推薦使用)。

  • 表格

String StringBuffer StringBuilder
String的值是不可變的,這就致使每次對String的操做都會生成新的String對象,不只效率低下,並且浪費大量優先的內存空間 StringBuffer是可變類,和線程安全的字符串操做類,任何對它指向的字符串的操做都不會產生新的對象。每一個StringBuffer對象都有必定的緩衝區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增長容量 可變類,速度更快
不可變 可變 可變
線程安全 線程不安全
多線程 操做字符串 單線程 操做字符串

END

相關文章
相關標籤/搜索