除了 8 種原始資料型別之外,其他型別都是參考資料型別 (Non-Primitive Data Types),像是常見的有 String, Array, Json 與 Map 等。此外,由使用者自行定義的類別 (Class) 也皆屬於參考資料型別。接下來幾天我整理了一下自己常會用到的一些資料型別來做分享。
String 為唯一 Java 原生的 Non-Primitive 資料型別,用於儲存文字類的資訊,可以視為字符的序列 (sequence of char);此外,String 類別一但建立後其值就無法修改喔。
Java 中的 String 具有索引 (index),可使用 charAt(index)
, 取得指定 index 的值,與 Python 中 string 可以使用 [ ] 取值不一樣。
// Java 中以 charAt(index) 取得指定位置的字符
String name = "Daniel";
name.charAt(0);
// D
name.charAt(2);
// n
另外,如果要從 String 取出部分的字串,在 Python 中,我們會使用 [ start, end ];但在 Java 中,需使用 substring(start, end)
,取得從 start index 到 end index 前的子字串(包含起始位置但不包含結束位置)。
name.substring(1, 3);
// an
String 提供了 concat()
的方法,可以將兩個 string 串接再一起,但實務上更常使用 “+”
就可以完成字串串接。
// 使用 concat()
String a = "Hello, ", b = "world!";
c = a.concat(b);
System.out.println(c);
// Out: Hello, world!
// 直接用 "+"
System.out.println( "Hello, " + "world!")
// Out: Hello, world!
取代分為單個字符取代replace(owChar, newChar)
與字串replaceAll(re_patten, newString)
取代。
replace(rowChar, newChar)
是以 newChar 取代原字串的 rowChar,並返回新的字串。
// replace(rowChar, newChar)
String name = new String("mary");
System.out.println(name.replace('m', 'M'));
// Out: Mary
replaceAll(re_patten, newString)
透過 Java 正規表達式 re_patten 搜尋,並以新字串取代所有比對到的原字串。如果只要取代第一個符合的字串,可以改用 replaceFirst(re_patten, newString)
。
// replaceAll(re_patten, newString)
String url = new String("www.apple.com");
System.out.println(url.replaceAll('apple', 'banana'));
// Out: www.banana.com
前面有提到 String 的值建立後是不可修改的,但這不是又可以用 concat(), replace() 等方法修改String 的值嗎?但其實不是…這些 String 的方法是將變動過的 String 重新儲存成一個新的字串,也就是說修改後的 String 完全是一個新的物件,存放在不同的記憶體位置。
那如果不希望因為修改不斷產生新的 String 物件,可以改嘗試使用 StringBuffer 可變字串。
StringBuffer 修改時會對本身的物件進行操作,不會另外產生新物件。
// 依據字串 str 建立新的 StringBuffer 物件
StringBuffer sb = new StringBuffer(String str);
StringBuffer morning = new StringBuffer("Good ");
StringBuffer 可以使用 append(), insert(), delete() 或 replace() 等方法進行操作。
於字尾添加字串 str。
//承上
morning.append("Morning!");
System.out.println(morning);
//Out: Good Morning!
從指定 index 添加 字串 str。
// 承上
morning.insert(0 ,"Hi, Leo. ");
System.out.println(morning);
//Out: Hi, Leo. Good Morning!
刪除指定 index 範圍的字串,範圍包含start index,不包含 end index。
// 承上
morning.delete(8 ,14); // 刪除”Good “
System.out.println(morning)
//Out: Hi, Leo. Morning!
將搜尋指定範圍的子字串,並將此字串替換成新的字串。
// 承上
morning.replace(4,7,"Mary"); // 將 Leo 替換成 Mary
System.out.println(morning);
//Out: Hi, Mary. Morning!