基礎程式設計(Java)· CH14
不可變的字元序列 · 導覽地圖
完整內容看 PDF 講義,動手步進與試跑看 index。
最關鍵的一件事
String s = "abc";
s.toUpperCase(); // 沒效果!結果被丟掉
s = s.toUpperCase(); // 要接住才拿得到 "ABC"
任何「修改」都回傳新字串、原字串不動。要用結果一定要接住。
建構
String s1 = "Hello"; // 常值(最常用,共用 string pool)
String s2 = new String("Hello"); // new 另配一個物件(位址不同)
String s3 = new String(new char[]{'J','a','v','a'}); // 從 char 陣列
new String 會生另一個物件——這是 == 陷阱的來源。
查詢
String s = "Hello";
s.length(); // 5(方法、有括號!)
s.charAt(0); // 'H' s.charAt(4); // 'o'(最後 = length()-1)
字串 length() 是方法;陣列 length 是欄位。別搞混。
比較(重災區)
String a = "x", c = new String("x");
a.equals(c); // true(比內容)
a == c; // false!== 比位址,c 是新物件
== 比「是不是同一個物件」,會被 string pool 誤導。compareTo 回負/0/正(字典序)。
搜尋與取段
"programming".indexOf("mm"); // 6(找不到回 -1)
"programming".substring(0, 4); // "prog"(含頭不含尾)
"a,b".replace(',', ';'); // "a;b"
" hi ".trim(); // "hi"
substring(a, b) 含 a 不含 b,長度 b-a。全部回傳新字串。
切分
"Amy,Ben,Cara".split(","); // {"Amy","Ben","Cara"}
"one two".split("\\s+"); // {"one","two"}(regex:一個以上空白)
參數是 regex;切句點要 "\\."(. 在 regex 是任意字元)。
可變的字串
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" Java"); // 原地接
sb.insert(5, ","); sb.reverse();
String r = sb.toString(); // 組好轉回 String
append/insert/delete/reverse 都改同一個物件。
為什麼要 StringBuilder
String s=s+"x" 跑 3 次生 4 個物件、前 3 個變垃圾。StringBuilder 全程1 個物件。
逐字元工具
Character.isDigit('7'); // true
Character.isLetter('A'); // true
Character.toUpperCase('a'); // 'A'
多為 static:傳一個 char,回判斷(boolean)或轉換後的 char。常配 charAt 逐格檢查。
輕量帶過
"12345".matches("\\d+"); // true(整串都是數字)
"a1b2".replaceAll("\\d", "*"); // "a*b*"
\\d 數字、\\s 空白、+ 一個以上。matches 要整串符合。完整 Pattern/Matcher 屬進階。
接下來