iT邦幫忙

2023 iThome 鐵人賽

DAY 8
0
自我挑戰組

轉職仔自學Java筆記本系列 第 8

Java 的 String 與 StringBuffer

  • 分享至 

  • xImage
  •  

除了 8 種原始資料型別之外,其他型別都是參考資料型別 (Non-Primitive Data Types),像是常見的有 String, Array, Json 與 Map 等。此外,由使用者自行定義的類別 (Class) 也皆屬於參考資料型別。接下來幾天我整理了一下自己常會用到的一些資料型別來做分享。

String 字串

String 為唯一 Java 原生的 Non-Primitive 資料型別,用於儲存文字類的資訊,可以視為字符的序列 (sequence of char);此外,String 類別一但建立後其值就無法修改喔。

String Index 取值

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 串接

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!

String 取代

取代分為單個字符取代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 可變字串

StringBuffer 修改時會對本身的物件進行操作,不會另外產生新物件。

// 依據字串 str 建立新的 StringBuffer 物件
StringBuffer sb = new StringBuffer(String str);

StringBuffer morning = new StringBuffer("Good ");

StringBuffer 可以使用 append(), insert(), delete() 或 replace() 等方法進行操作。

StringBuffer 添加字串 append(String str)

於字尾添加字串 str。


//承上
morning.append("Morning!");
System.out.println(morning);

//Out: Good Morning! 

StringBuffer 插入字串 insert(int index, String str)

從指定 index 添加 字串 str。


// 承上
morning.insert(0 ,"Hi, Leo. ");

System.out.println(morning);
//Out: Hi, Leo. Good Morning!

StringBuffer 刪除字串 delete(int startIndex, int endIndex)

刪除指定 index 範圍的字串,範圍包含start index,不包含 end index。


// 承上
morning.delete(8 ,14); // 刪除”Good “
System.out.println(morning)
//Out: Hi, Leo. Morning!

StringBuffer 取代字串 replace (int startIndex, int endIndex, String str)

將搜尋指定範圍的子字串,並將此字串替換成新的字串。


// 承上
morning.replace(4,7,"Mary"); // 將 Leo 替換成 Mary
System.out.println(morning);
//Out: Hi, Mary. Morning!


上一篇
包裝類別(Wrapper Class)- 以 int 與 Integer 為例
下一篇
Java 的陣列 (Array) 與動態陣列 (ArrayList)
系列文
轉職仔自學Java筆記本22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言