Java字符串使用總結

Java字符串使用總結
 
前言:
這篇文章的目的是提醒你們對字符串三種類型作個綜合的比較,使得在使用字符串三種類的時候有個選擇依據,這樣能夠極大提升程序運行的效率。若是你對這三個類已經很熟悉了,我明確告訴你,你須要看了,若是你還不明白字符串是什麼,想有個大概認識,ok,繼續! 若是你向學習這三種類具體怎麼用的,抱歉,請看API文檔去。
 
此文章參考了API文檔,但不是API文檔的拷貝,明鑑!
 
1、String類
String 類不是原始基本數據類型,在Java中,字符串是一個對象。
String 類表明字符串。Java 程序中的全部字符串字面值(如 "abc" )都做爲此類的實例來實現。
 
字符串是常量;它們的值在建立以後不能改變。字符串緩衝區支持可變的字符串。由於 String 對象是不可變的,因此能夠共享它們。例如:
 
 
     String str = "abc";
 等效於:
 
 
     char data[] = {'a', 'b', 'c'};
     String str = new String(data);
 下面給出了一些如何使用字符串的更多例子:
 
 
     System.out.println("abc");
     String cde = "cde";
     System.out.println("abc" + cde);
     String c = "abc".substring(2,3);
     String d = cde.substring(1, 2);
 
既然是字符串是對象,那麼任何String的變量,在沒有初始化以前,它的值都爲null,其實全部的沒有初始化的對象的值都是null;全部的原始類型的變量在沒有初始化以前Java編譯器都會給出一個默認值。
 
Java 語言提供對字符串串聯符號("+")和其餘對象到字符串的轉換的特殊支持。字符串串聯是經過 StringBuilder(或 StringBuffer)類及其 append 方法實現的。字符串轉換是經過 toString 方法實現的,該方法由 Object 類定義,並可被 Java 中全部類繼承。有關字符串串聯和轉換的更多信息,請參閱 Gosling、Joy 和 Steele 合著的《The Java Language Specification》。
 
除非另行說明,不然將 null 參數傳遞給此類中的構造方法或方法都會拋出 NullPointerException。
 
String 表示一個 UTF-16 格式的字符串,其中的增補字符 由代理項對 表示(有關詳細信息,請參閱 Character 類中的 Unicode 字符表示形式)。索引值是指 char 代碼單元,所以增補字符在 String 中佔用兩個位置。
 
String 類提供處理 Unicode 代碼點(即字符)和 Unicode 代碼單元(即 char 值)的方法。
 
String使用的陷阱:String一經初始化後,就不會在改變其內容了。對String字符串的操做實際上對其副本(原始拷貝)的操做,原來的字符串一點都沒有改變。好比:
string s="a"; //建立了一個字符串
s=s+"b"; //實際上原來的"a"字符串對象已經丟棄了,如今又產生了一個字符串s+"b"(也就是"ab")。若是屢次執行這些改變串內容的操做,會致使大量副本字符串對象存留在內存中,下降效率。若是這樣的操做放到循環中,會極大影響程序的性能。
 
相反,StringBuffer類是對原字符串自己操做的,能夠對字符串進行修改而不產生副本拷貝。能夠在循環中使用。
所以,若是要對字符串作修改處理等操做,最好避免直接用String類型。能夠選用StringBuffer類型。
 
2、StringBuffer類
StringBuffer類是線程安全的可變字符序列。一個相似於 String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但經過某些方法調用能夠改變該序列的長度和內容。
 
可將字符串緩衝區安全地用於多個線程。能夠在必要時對這些方法進行同步,所以任意特定實例上的全部操做就好像是以串行順序發生的,該順序與所涉及的每一個線程進行的方法調用順序一致。
 
StringBuffer 上的主要操做是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每一個方法都能有效地將給定的數據轉換成字符串,而後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。
 
例如,若是 z 引用一個當前內容爲 "start" 的字符串緩衝區對象,則此方法調用 z.append("le") 會使字符串緩衝區包含 "startle",而 z.insert(4, "le") 將更改字符串緩衝區,使之包含 "starlet"。
 
一般,若是 sb 引用 StringBuilder 的一個實例,則 sb.append(x) 和 sb.insert(sb.length(), x) 具備相同的效果。
 
當發生與源序列有關的操做(如源序列中的追加或插入操做)時,該類只在執行此操做的字符串緩衝區上而不是在源上實現同步。
 
每一個字符串緩衝區都有必定的容量。只要字符串緩衝區所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區數組。若是內部緩衝區溢出,則此容量自動增大。從 JDK 5 開始,爲該類補充了一個單個線程使用的等價類,即 StringBuilder。與該類相比,一般應該優先使用 StringBuilder 類,由於它支持全部相同的操做,但因爲它不執行同步,因此速度更快。
 
 
3、StringBuilder類
StringBuilder類是一個可變的字符序列。此類提供一個與 StringBuffer 兼容的 API,但不保證同步。該類被設計用做 StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種狀況很廣泛)。若是可能,建議優先採用該類,由於在大多數實現中,它比 StringBuffer 要快。
 
在 StringBuilder 上的主要操做是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每一個方法都能有效地將給定的數據轉換成字符串,而後將該字符串的字符追加或插入到字符串生成器中。append 方法始終將這些字符添加到生成器的末端;而 insert 方法則在指定的點添加字符。
 
例如,若是 z 引用一個當前內容爲 "start" 的字符串的生成器對象,則該方法調用 z.append("le") 將使字符串生成器包含 "startle",而 z.insert(4, "le") 將更改字符串生成器,使之包含 "starlet"。
 
一般,若是 sb 引用 StringBuilder 的實例,則 sb.append(x) 和 sb.insert(sb.length(), x) 具備相同的效果。每一個字符串生成器都有必定的容量。只要字符串生成器所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區。若是內部緩衝區溢出,則此容量自動增大。
 
將 StringBuilder 的實例用於多個線程是不安全的。若是須要這樣的同步,則建議使用 StringBuffer。
 
4、字符串的比較
」==「比較此字符串是否引用同一個實例,是否指向同一個內存地址。
equals(Object anObject)比較此字符串是不是同一個實例,是否指向同一個內存地址。
equalsIgnoreCase(String anotherString)將此 String 與另外一個 String 進行比較,不考慮大小寫。
 
 
 
 
 
參考資料:
java api 中文文檔
相關文章
相關標籤/搜索