1. 程式人生 > >Java中,String、StringBuffer、StringBuilder區別與使用

Java中,String、StringBuffer、StringBuilder區別與使用

一、簡介

在 Java 語言中,共有 8 個基本的資料型別,分別為:byte、short、int、long、float、double、boolean 和 char,其中 char 型別用於表示單個字元,例如 a、b、c 、A、B、C、& 這些大小寫字母或者特殊字元等等。在實際的程式設計中,單個的字元並沒有我們想象中用的那麼頻繁,反而是多個字元組成的“字串”更為常見,但是在基本的資料型別中,並沒有字串這種資料型別。為了解決這個問題,Java 語言為我們提供了一個被 final 關鍵字修飾的類 String,她就表示字串型別,同時由於其被 final 修飾,這也表明咱們只能用這個類建立字串以及呼叫其中的方法,卻不能繼承她。
這裡寫圖片描述


雖然 Java 語言為我們提供了字串類 String,能讓我們方便的使用字串型別,姑且這麼說,但是在不斷的發展中,我們發現單純的 String 型別,並不足以滿足我們的需求啦!因此,在 String 型別的基礎上,又衍生出了兩個字串構建器 StringBuffer 和 StringBuilder。

二、String

我們已經大致瞭解了 String 型別啦!說她是一個數據型別,但她並不是基本資料型別,而是一個被 final 修飾的、不可被繼承的類,位於 java.lang 包。至於如何使用 String 型別,有兩種方法,一是直接賦值,二是用 new 建立,具體示例如下:

// 1、直接賦值
String str1 = "維C果糖"// 2、用 new 運算子建立 String str2 = new String("維C果糖");

在常見的字串操作中,判斷兩個字串是否相等尤為常見,且常用的判別方式有兩種,即用 String 類提供的方法 equals 和 == 運算子,下面是使用頻率比較高的 String 類的 API 方法:

boolean endsWith(String suffix)
//* 如果字串以 suffix 結尾,則返回 true,否則返回 false */

boolean equals(Object other)
/* 如果字串與 other 相等,則返回 true,否則返回 false */
boolean equalsIgnoreCase(String other) /* 如果字串與 other 相等(忽略大小寫),則返回 true,否則返回 false */ int length() /* 返回字串的長度 */ String replace(CharSequence oldString, CharSequence newString) /* 返回一個新字串,這個字串用 newString 字串代替原始字串中所以的 oldString 字串,可以用 String 或者 StringBuilder 物件作為 CharSequence 引數 */ boolean startsWith(String prefix) /* 如果字串以 prefix 開始,則返回 true,否則返回 false */ String substring(int beginIndex) String substring(int beginIndex, int endIndex) /* 返回一個新字串,這個字串包含原始字串中從 beginIndex 到串尾或 endIndex-1 位置的所以程式碼單元 */ String toLowerCase() /* 返回一個新字串,這個字串將原始字串中的所以大寫字母都改成了小寫字母 */ String toUpperCase() /* 返回一個新字串,這個字串將原始字串中的所以小寫字母都改成了大寫字母 */ String trim() /* 返回一個新字串,這個字串將刪除元字串頭部和尾部的空格 */

三、StringBuffer

在我們瞭解了 String 類之後,我們會發現她有些缺陷,例如當我們建立了一個 String 類的物件之後,我們很難對她進行增、刪、改的操作,為了解決這個弊端,Java 語言就引入了 StringBuffer 類。StringBuffer 和 String 類似,只是由於 StringBuffer 的內部實現方式和 String 不同,StringBuffer 在進行字串處理時,不用生成新的物件,所以在記憶體的使用上 StringBuffer 要優於 String 類。

在 StringBuffer 類中存在很多和 String 類一樣的方法,這些方法在功能上和 String 類中的功能是完全一樣的。但是有一個非常顯著的區別在於,StringBuffer 物件每次修改都是修改物件本身,這點是其和 String 類的最大區別。

此外,StringBuffer 是執行緒安全的,可用於多執行緒。

這裡說一下什麼是執行緒安全:
一個執行緒訪問資源的時候為其加鎖,別的執行緒只有等到該執行緒釋放資源後才能使用,這樣做為了防止資料的非正常改變和使用,這裡所說的資源通常是程式中的全域性變數

而且 StringBuffer 物件的初始化與 String 物件的初始化不大一樣,通常情況下,我們使用構造方法進行初始化,即:

// 宣告一個空的 StringBuffer 物件
StringBuffer sb = new StringBuffer();

// 宣告並初始化 StringBuffer 物件
StringBuffer sb = new StringBuffer("維C果糖");

// 下面的賦值語句是錯的,因為 StringBuffer 和 String 是不同的型別
StringBuffer sb = "維C果糖";

// 下面的賦值語句也是錯的,因為 StringBuffer 和 String 沒有繼承關係
StringBuffer sb = (StringBuffer)"維C果糖";

// 將 StringBuffer 物件轉化為 String 物件
StringBuffer sb = new StringBuffer("維C果糖");
String str = sb.toString();

下面是StringBuffer的常用API方法

StringBuffer()
/* 構造一個空的字串構建器 */

int length()
/* 返回構建器或緩衝器中的程式碼單元(字元)數量 */

StringBuffer append(String str)
/* 追加一個字串並返回一個 this */

StringBuffer append(Char c)
/* 追加一個字元並返回一個 this */

void setCharAt(int i, char c)
/* 將第 i 個程式碼單元設定為 c */

StringBuffer reverse()
/* 將構建器的內容進行順序的反轉 c */

String toString()
/* 返回一個與構建器或緩衝器內容相同的字串 */

四、StringBuilder

在 JDK 5.0 之後,Java 語言又引入了 StringBuilder 類,這個類的前身是 StringBuffer,其效率略微有些低,但允許採用多執行緒的方式執行新增或者刪除字元的操作。如果所有的字串在一個單執行緒中(通常都是這樣)編輯,則應該用 StringBuilder 代替她,這兩個類的 API 是完全相同的。

五、總結

過以上的介紹,咱們已經詳細的瞭解了 String、StringBuffer 和 StringBuilder,也知道了她們三個都是用於操作字串的類。接下來總結一些三者的區別
* 對於操作效率而言,一般來說,StringBuilder > StringBuffer > String;
* 對於執行緒安全而言,StringBuffer 是執行緒安全的,可用於多執行緒;而 StringBuilder 是非執行緒安全的,用於單執行緒;
* 對於頻繁的字串操作而言,無論是 StringBuffer 還是 StringBuilder,都優於 String。