字串
Last updated
Last updated
介紹字串類別及常用方法。
字串String可以代表字元的串列,例如 "abc" 就是一個字串類別的實體。
字串是常數(constant),在記憶體中被初始化就無法再做更改。
String類別身為參考資料型態,一樣必須實體化才有資料,而String的實體化方式非常自由。
利用兩個雙引號『" "』夾起來的字元就會在Heap初始化物件產生空間,回傳reference給String變數。
記憶體配置:
String 的建構子非常多元,也可以透過字元陣列去創造字串:
更多String的建構子請參考document,因為真的太多了。
很多時候我們會希望把兩個或以上的字串串在一起做輸出,在Java要如何辦到呢?
執行結果:
字串串接的方法; 1. 利用加號運算子『+』。 2. 呼叫 .concat(String) 方法,會回傳自己的內容串接參數內容的結果字串。
在本章結開頭第二行提到,字串是常數,被初始化後就不能改變其值,那為什麼上面還可以對字串做串接的動作呢?
事實上,字串還是沒有被修改到,而是你的reference被指到了另一個物件。
舉個例子:
String a = "happy";
記憶體在Stack區有一個字串變數 a ,內容指到Heap區的 "happy"物件。
a = a + "day";
程式在Heap區另外開了一個新的字串物件,該物件的資料內容是"happyday",也就是實際兩字串串接的結果,再把這個新的物件參考(reference)指定給變數a。 完成這個『看起來字串有增長』的動作。
那,那個可憐的 "happy" 怎麼辦?
如果程式中沒有任何參考(reference)指向他,那他在Heap區就如同垃圾一般的存在,在Java執行垃圾回收(Garbage Collection)時他的資源會被釋放掉。
這就是字串串接內部的動作,由於字串是常數,所以任何會改變其內容的動作(串接、取代、刪除等),在記憶體中都是以類似的方法動作的。
在處理字串時常常會需要判斷兩個字串是否相等,要怎麼做呢?
來看一個例子:
執行結果:
如果你的目的是判斷兩個字串物件的『內容值』有沒有相等,顯然不能用『==』去做比對。用『==』運算子比對的是 變數a 與 變數b 的『值』有沒有相等,字串是參考資料型態,變數a及變數b只是存放在Stack區的變數,他們的內容值是真實物件的reference,並不是物件內容。
記憶體配置圖:
從圖中很明顯看到,如果用『==』運算子的話,只會做 0100==0110 的比較,那當然會回傳false,但我們目的不是要比較reference有沒有相等,而是比較字串物件的內容有沒有相等,所以不應該用『==』。
需要比對字串內容值的話,需要的是字串方法: equals()
public boolean equals(String str) 回傳str是否與自身物件的內容值相等。
範例程式:
執行結果:
雖然方法還是建議大家去看document然後實際操作過,不過這邊講幾個超常用的方法給新手參考參考,以後如果有需要就可以直接用了。
修飾子 回傳型態
方法
描述
char
charAt(int index)
回傳第index的字元
String
concat(String str)
回傳串接上str的字串
boolean
contains(CharSequence s)
是否包含字串s
boolean
endsWith(String suffix)
是否為suffix結尾
boolean
equals(Object anObject)
是否與anObject相等
static String
format(String format, Object... args)
回傳利用format為格式的字串
int
indexOf(String str)
回傳str在此字串的索引值
int
lastIndexOf(String str)
回傳最後一個str在此字串的索引值
int
length()
回傳字串長度
boolean
matches(String regex)
是否與正規表示式regex相符
String
replaceAll(String regex, String replacement)
把字串中的regex都換成replacement
String
replaceFirst(String regex, String replacement)
把字串中第一個regex換成replacement
String[]
split(String regex)
回傳利用regex切割過的字串陣列
boolean
startsWith(String prefix)
是否為prefix開頭
String
substring(int beginIndex)
回傳從beginIndex開始到結尾的子字串
String
substring(int beginIndex, int endIndex)
回傳從beginIndex開始到endIndex(不涵)的子字串
char[]
toCharArray()
回傳此字串的字元陣列
String
toLowerCase()
回傳把所有英文字母都變小寫的字串
String
toUpperCase()
回傳把所有英文字母都變大寫的字串
String
trim()
回傳刪除前後空白的字串