一個字元串就是一個字元序列,字元串被廣泛應用于 Java 程式設計。
Java語言将字元串作為<code>String</code>類型的對象進行處理。<code>String</code>類放在<code>java.lang</code>包中,不需要<code>import</code>就能直接使用。
<code>String</code>并不是基本的資料類型,是一個對象,并且是一個不可變的對象,在初始化前一個<code>String</code>對象的值為<code>null</code>。
最常用的建立字元串對象的方法如下:
它等價于:
當使用一個數組建立一個<code>String</code>對象時,數組的内容将被複制。在String被建立之後,如果改變數組的内容,<code>String</code>将不會随之改變。
我們來比較以下三個字元串:
<code>str1</code>的值為null,表示沒有指向任何字元串對象;<code>str2</code>已經指向了一個字元串對象,這個對象的字元序列内容為空;<code>str3</code>是顯式地調用構造函數建立字元串對象,該對象的字元序列内容為空,與第二行代碼是基本一樣的。
字元串可以通過<code>+</code>和<code>+=</code>操作符進行拼接,比如:
最後<code>str1</code>和<code>str2</code>所指向的字元串内容為"abcdef"。
String的比較
判斷内容是否相同 boolean equals(Object anObject)
判斷内容是否相同,在比較時忽略大小寫 boolean equalsIgnoreCase()
比較兩個字元串的字典順序 int compareTo (String anotherString)
比較兩個字元串的字典順序,在比較式忽略字母大小寫 int compareToIgnoreCase(String anotherString)
比較兩個引用,是否指向同一個String對象 ==
equals()與==的差別
如果兩個字元串變量指向的字元串序列内容完全一樣,equals()傳回true;如果兩個字元串變量指向同一個對象,==傳回true。
以上代碼,第一個輸出為<code>false</code>,第二個輸出為<code>true</code>。
String的查找
傳回指定索引index位置上的字元,索引範圍從0開始 char charAt(int index)
從字元串開始檢索str,并傳回第一次出現的位置,未出現傳回-1 int indexOf(String str)
從字元串的第fromIndex個字元開始檢索str int indexOf(String str,int fromindex)
查找最後一次出現的位置 int lastIndexOf(String str)
從字元串的第fromIndex個字元查找最後一次出現的位置 int lastIndexOf(String str,int fromIndex)
測試此字元串從指定索引開始的子字元串是否以指定字首開始 boolean startsWith(String prefix,inttoffset)
測試此字元串是否以指定的字首開始 boolean startsWith(String prefix)
測試此字元串是否以指定的字尾結束 boolean endsWith(String suffix)
String的替換
string的替換涉及到string對象的修改。注意每一個修改string對象的操作,都會建立一個新的string的對象,這個對象包含了修改後的字元串内容。最初的string對象則未發生任何變化。
把原來的oldCHar字元替換為newChar字元,傳回新串 String replace(char oldChar,char newChar)
把原來的target子序列替換為replacement序列,傳回新串 String replace(CharSequence targrt,CharSequence replacement)
注意這裡的CharSequence類是String類的父類,我們可以傳入String類型的參數。
執行後,<code>str2</code>所指向的字元串内容為"xxxxyz"。
String的截取
傳回一個新的字元串,它是此字元串的一個子字元串 String subString(int beginindex)
傳回一個新的字元串,它從下标beginIndex開始,到endIndex-1的子串 String subString(int beginIndex,int endIndex)
StringBuffer
<code>StringBuffer</code>表示表示可變長的和可修改的字元序列。我們可以<code>StringBuffer</code>進行插入或者追加字元序列、翻轉字元序列等操作。
<code>StringBuffer</code>必須通過構造函數進行初始化,它有三個構造方法:
<code>StringBuffer()</code>:預設的構造方法預留16個字元的空間
<code>StringBuffer(int size)</code>:第二種形式接收一個整數參數,顯示的設定緩沖區的大小
<code>StringBuffer(String str)</code>:第三種形式接收一個<code>String</code>參數,設定<code>StringBuffer</code>對象的初始内容,同時多預留16個字元的空間
<code>StringBuffer</code>的許多方法和<code>String</code>類都差不多,功能幾乎一模一樣。
<code>String</code>類型和<code>StringBuffer</code>類型的主要差別其實在于<code>String</code>是不可變的對象, 是以在每次對<code>String</code>對象進行改變的時候其實都會生成一個新的<code>String</code>對象。是以經常改變内容的字元串最好不要用<code>String</code> ,因為每次生成對象都會對系統性能産生影響。
使用<code>StringBuffer</code>類則會對<code>StringBuffer</code>對象本身進行操作,而不是生成新的對象。是以在一般情況下我們推薦使用<code>StringBuffer</code>,特别是字元串對象經常改變的情況下。<code>StringBuffer</code>類的操作性能要優于<code>String</code>。
了解了這個差別,我們也應該比較明确兩者的使用場景了。
使用<code>String</code>的場景:在字元串不經常變化的場景中可以使用<code>String</code>類,例如常量的聲明、少量的變量運算。
使用<code>StringBuffer</code>類的場景:在頻繁進行字元串運算(如拼接、替換、删除等),并且運作在多線程環境中,則可以考慮使用<code>StringBuffer</code>,例如XML解析、HTTP參數解析和封裝。
StringBuffer 的常用操作
得到目前StringBuffer的長度 int length()
得到總的配置設定容量 int capacity()
為構造好的StringBuffer預配置設定空間,設定緩沖區的大小,在已知需要追加大量的字元的情況下很有用 void ensureCapacity(int capacity)
在StringBuffer對象内設定緩沖區的大小 void setLength(int len)
從StringBuffer對象中得到單個字元 char charAt(int index)
将StringBuffer的index位的字元置為ch void setCharAt(int index,char ch)
将StringBuffer的子字元串複制給數組 void getChars(int sourceStart,intsourceEnd,char target[],int targetStart)
将其他類型資料的字元串形式拼接到StringBuffer對象後面 StringBuffer append(Object obj)
将String類型的字元串拼接到StringBuffer對象後面 StringBuffer append(String str)
将StringBuffer類型的字元串拼接到StringBuffer對象後面 StringBuffer append(StringBuffer str)
将字元數組類型的字元串拼接到StringBuffer對象後面 StrignBuffer append(char[] str)
在StringBuffer對象中插入内容 insert(int n,String str)
用于一處StringBuffer對象中,删除這個序列的一個子字元串中的字元。子字元串的開始在指定的start和延伸處的字元索引end - 1或結束的序列 delete(int start,int end)