字串
介紹字串類別及常用方法。
字串String可以代表字元的串列,例如 "abc" 就是一個字串類別的實體。
字串是常數(constant),在記憶體中被初始化就無法再做更改。
初始化String
String類別身為參考資料型態,一樣必須實體化才有資料,而String的實體化方式非常自由。
利用兩個雙引號『" "』夾起來的字元就會在Heap初始化物件產生空間,回傳reference給String變數。
記憶體配置:
String 的建構子非常多元,也可以透過字元陣列去創造字串:
更多String的建構子請參考document,因為真的太多了。
字串串接 String Concat
很多時候我們會希望把兩個或以上的字串串在一起做輸出,在Java要如何辦到呢?
執行結果:
字串串接的方法; 1. 利用加號運算子『+』。 2. 呼叫 .concat(String) 方法,會回傳自己的內容串接參數內容的結果字串。
字串的修改?
在本章結開頭第二行提到,字串是常數,被初始化後就不能改變其值,那為什麼上面還可以對字串做串接的動作呢?
事實上,字串還是沒有被修改到,而是你的reference被指到了另一個物件。
舉個例子:
第一行 String a = "happy";
String a = "happy";
記憶體在Stack區有一個字串變數 a ,內容指到Heap區的 "happy"物件。
第二行 a = a + "day";
a = a + "day";
程式在Heap區另外開了一個新的字串物件,該物件的資料內容是"happyday",也就是實際兩字串串接的結果,再把這個新的物件參考(reference)指定給變數a。 完成這個『看起來字串有增長』的動作。
那,那個可憐的 "happy" 怎麼辦?
如果程式中沒有任何參考(reference)指向他,那他在Heap區就如同垃圾一般的存在,在Java執行垃圾回收(Garbage Collection)時他的資源會被釋放掉。
這就是字串串接內部的動作,由於字串是常數,所以任何會改變其內容的動作(串接、取代、刪除等),在記憶體中都是以類似的方法動作的。
字串相等 String Equals
在處理字串時常常會需要判斷兩個字串是否相等,要怎麼做呢?
來看一個例子:
執行結果:
如果你的目的是判斷兩個字串物件的『內容值』有沒有相等,顯然不能用『==』去做比對。用『==』運算子比對的是 變數a 與 變數b 的『值』有沒有相等,字串是參考資料型態,變數a及變數b只是存放在Stack區的變數,他們的內容值是真實物件的reference,並不是物件內容。
記憶體配置圖:
從圖中很明顯看到,如果用『==』運算子的話,只會做 0100==0110 的比較,那當然會回傳false,但我們目的不是要比較reference有沒有相等,而是比較字串物件的內容有沒有相等,所以不應該用『==』。
需要比對字串內容值的話,需要的是字串方法: equals()
public boolean equals(String str) 回傳str是否與自身物件的內容值相等。
範例程式:
執行結果:
好用方法 useful Method
雖然方法還是建議大家去看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() | 回傳刪除前後空白的字串 |
Last updated