基礎程式設計(Java)· CH14

字串、字元與正規表達式

不可變的字元序列 · 導覽地圖

完整內容看 PDF 講義,動手步進與試跑看 index。

最關鍵的一件事

String 不可變(immutable)

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 會生另一個物件——這是 == 陷阱的來源。

查詢

length() 與 charAt()

String s = "Hello";
s.length();   // 5(方法、有括號!)
s.charAt(0);  // 'H' s.charAt(4); // 'o'(最後 = length()-1)

字串 length()方法;陣列 length欄位。別搞混。

比較(重災區)

比內容用 equals,不要用 ==

String a = "x", c = new String("x");
a.equals(c);  // true(比內容)
a == c;       // false!== 比位址,c 是新物件

== 比「是不是同一個物件」,會被 string pool 誤導。compareTo 回負/0/正(字典序)。

搜尋與取段

indexOf · substring · replace

"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。全部回傳新字串。

切分

split → String[]

"Amy,Ben,Cara".split(",");  // {"Amy","Ben","Cara"}
"one  two".split("\\s+");   // {"one","two"}(regex:一個以上空白)

參數是 regex;切句點要 "\\.". 在 regex 是任意字元)。

可變的字串

StringBuilder:原地改

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 接三次 = 4 個物件

""垃圾 "x"垃圾 "xx"垃圾 "xxx"s 指向

String s=s+"x" 跑 3 次生 4 個物件、前 3 個變垃圾。StringBuilder 全程1 個物件

逐字元工具

Character 類別

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 屬進階。

接下來

把字串練到自動

  • PDF 講義 完整內容+不可變記憶體圖+String vs StringBuilder
  • index 不可變逐步生物件+試跑
  • 本地練習 5 題 反轉/計次/大小寫/組裝/split
  • 複習測驗 自測到 90%