第 7 章 字串 1
本章提要 7.1 前言 7.2 類別與物件 7.3 String 類別 7.4 StringBuffer 類別 7.5 綜合練習 7.6 後記 2
7.1 前言 Java 用 String 類別 (Class) 來處理字串, String 類別是 Java 類別庫內建的類別, 它是一堆已經寫好的程式, 我們可以直接拿來使用字串很像字元型別的一維陣列, 字串裡能存放的資料都屬於字元性質, 但在應用上又與字元陣列有所不同基本資料型別參考資料型別本章將介紹的主題有 : String 類別 StringBuffer 類別 3
7.2 類別與物件 每一個類別都有一個名稱, 它是由專屬的資料成員和成員函式所封裝 (Encapsulation) 而成 資料成員 : 就是一些變數, 這些變數用來描述類別的屬性特徵成員函式 : 又稱為方法 (Method), 可以對類別所產生的物件 (Object)( 或類別本身 ) 進行操作 4
圖 7.1: 類別 7.2 類別與物件 5
7.2 類別與物件 建構元 (Constructor) 和類別名稱相同的方法 ( 函式 ) 建構元專門用來產生屬於該類別的物件, 而其他的方法則可以對物件本身進行操作 一個類別可以擁有多個建構元 6
7.3 String 類別 String 類別提供多種建構元, 我們可以用建構元來產生 String( 字串 ) 物件 String 類別也提供許多方法, 我們用方法來操作物件 String 類別提供的方法包括 取得字串的長度 擷取字元 擷取子字串 將字串串接 字串的搜尋與取代 字串的大小寫轉換 7
7.3.1 String 類別的建構元 String 類別的建構元專門用來產生 String 物件 一旦指定 String 物件的值之後, 除了重新指定外, 不可以局部更改它的值如果必須局部改變字串的值, 那麼就須改用 StringBuffer 類別來宣告了 ( 參考 7.4 節 ) 8
7.3.1 String 類別的建構元 圖 7.2:http://java.sun.com/j2se/1.5.0/docs/api/index.html 9
7.3.1 String 類別的建構元 表 7.1:String 類別提供的建構元 項次 String 類別的建構元 1 public String() 2 public String(byte[] bytes) 3 public String(byte[] ascii, int hibyte) 4 5 6 7 public String(byte[] bytes, int offset, int length) public String(byte[] ascii, int hibyte, int offset, int count) public String(byte[] bytes, int offset, int length, String charsetname) public String(byte[] bytes, String charsetname) 10
7.3.1 String 類別的建構元 表 7.1:String 類別提供的建構元 項次 String 類別的建構元 8 public String(char[] value) 9 10 public String(char[] value, int offset, int count) public String(int[] codepoints, int offset, int count) 11 public String(String original) 12 String(StringBuffer buffer) 13 String(StringBuilder builder) 11
7.3.2 String 類別提供的方法 圖 7.3:http://java.sun.com/j2se/1.5.0/docs/api/index.html 12
7.3.2 String 類別提供的方法 表 7.2:String 類別提供的方法 項次 String 類別的方法說明 1 char charat(int index) //Returns the char value at the specified index. 自本字串取得 index 位置的字元 2 3 string concat(string str) //Concatenates the specified string to the end of this string. int indexof(string str) //Returns the index within this string of the first occurrence of the specified substring. 將 str 字串串接在本字串之後 取得 str 字串第一次出現的位置 13
7.3.2 String 類別提供的方法 表 7.2:String 類別提供的方法 其餘請參考課本 14
7.3.3 使用 String 類別的建構元來建立字串 使用 String 類別來建立字串語法 1 String 字串變數 = " 字串值 "; // 字串值須用雙引號 (") 框住 使用 String 類別來建立字串語法 2 String 字串變數 ; 字串變數 = " 字串值 " // 字串值須用雙引號 (") 框住 使用 String 類別來建立字串語法 3 String 字串變數 = new String(); 字串變數 = " 字串值 " // 字串值須用雙引號 (") 框住 使用 String 類別來建立字串語法 4 String 字串變數 = new String(" 字串值 "); 15
7.3.3 使用 String 類別的建構元來建立字串 語法 範例 1 String s1 = " 我愛喝 java 咖啡!"; 2 3 4 String s2; s2 = " 我愛喝 java 咖啡!"; String s3 = new String(); s3 = " 我愛喝 java 咖啡!"; String s4 = new String(" 我愛喝 java 咖啡!"); 16
7.3.3 使用 String 類別的建構元來建立字串 範例程式 1 建立字串 2 // 程式名稱 :ch07_string_1.java 10 String s1 = " 我愛喝 java 咖啡!"; 11 12 String s2; 13 s2 = " 我愛喝 java 咖啡!"; 14 15 String s3 = new String(); 16 s3 = " 我愛喝 java 咖啡!"; 17 18 String s4 = new String(" 我愛喝 java 咖啡!"); 17
7.3.3 使用 String 類別的建構元來建立字串 20 System.out.println("s1=" + s1); 21 System.out.println("s2=" + s2); 22 System.out.println("s3=" + s3); 23 System.out.println("s4=" + s4); 執行結果 s1= 我愛喝 java 咖啡! s2= 我愛喝 java 咖啡! s3= 我愛喝 java 咖啡! s4= 我愛喝 java 咖啡! 18
7.3.3 使用 String 類別的建構元來建立字串 範例程式 2 使用 String 類別的建構元來建立字串物件 2 // 程式名稱 :ch07_string_2.java 10 char ca[] = {' 我 ',' ','l','o','v','e',' ', 'J','a','v','a','!'}; 11 執行結果 12 String s1 = new String(ca); 0123456789012 13 String s2 = new String(ca,0,6); ca= 我 love Java! 14 String s3 = new String(ca,7,5); s1= 我 love Java! 15 s2= 我 love s3=java! 16 System.out.println(" 0123456789012"); 17 System.out.println("ca=" + new String(ca)); 19
7.3.4 取得字串的長度 取得字串的長度語法 1. 字串變數.length(); 2." 字串值 ".length(); 20
7.3.4 取得字串的長度 範例程式 3 取得字串的長度 2 // 程式名稱 :ch07_stringlength.java 11 String s1 = new String(" 我愛喝 java 咖啡!"); 12 String s2 = new String("I love Java coffee."); 14 System.out.println(" 012345678901234567890"); 15 System.out.println("s1=" + s1 + ", 其長度為 " + s1.length()); 16 System.out.println("s2=" + s2 + ", 其長度為 " + s2.length()); 執行結果 012345678901234567890 s1= 我愛喝 java 咖啡!, 其長度為 10 s2=i love Java coffee., 其長度為 19 21
7.3.5 擷取字元 擷取子字串 擷取字元語法 1. 字元變數 = 字串變數.charAt( 索引 i); // 擷取第 i 個字元 2. 字元陣列 = 字串變數.toCharArray(); // 將字串轉成字元陣列 3. 字串變數 1.getChars( 開始索引 i, 結束索引 j, char 陣列 c, b); 22
7.3.5 擷取字元 擷取子字串 假設 s1 字串的內容為 I love Java coffee.", 其結構如下圖 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 I l o v e J a v a c o f f e e. 敘述 c1 = s1.charat(7); c2 = s1.tochararray(); s1.getchars(7,11,c3,0); C1 = 'J' 結果 C2 = "I love Java coffee." C3 = "Java" 23
7.3.5 擷取字元 擷取子字串 範例程式 4 擷取字元, 擷取子字串 2 // 程式名稱 :ch07_stringtochar.java 12 String s1 = new String(ca); 11 String s1 = new String("I love Java coffee."); 12 char c1, c2[], c3[] = new char[4]; 13 執行結果 14 c1 = s1.charat(7); s1=i love Java coffee. 15 c2 = s1.tochararray(); c1=j 16 s1.getchars(7, 11, c3, 0); c2=i love Java coffee. 17 c3=java 18 System.out.println("s1=" + s1); 19 System.out.println("c1=" + c1); 20 System.out.println("c2=" + new String(c2)); 21 System.out.println("c3=" + new String(c3)); 24
7.3.5 擷取字元 擷取子字串 擷取子字串語法 字串變數 2 = 字串變數 1.substring( 開始索引 i, 結束索引 j); // 將字串變數 1 的第 i 個字元到第 j-1 個字元複製出來, 並指定給字串變數 2 // 本敘述不會改變字串變數 1 原有的值 25
7.3.5 擷取字元 擷取子字串 範例程式 5 擷取子字串 2 // 程式名稱 :ch07_substring.java 11 String s1 = new String("I love Java coffee."); 12 String s2 = s1.substring(7,18); 13 執行結果 15 String s3 = " 我愛喝 java 咖啡!"; s2=java coffee 16 String s4 = s3.substring(3,9); s4=java 咖啡 17 18 System.out.println("s2=" + s2); 19 System.out.println("s4=" + s4); 26
7.3.6 字串的串接 字串的串接語法 1. 字串變數 1 = 字串變數 2 + 字串變數 3; 2. 字串變數 1 = 字串變數 2.concat( 字串變數 3); 27
7.3.6 字串的串接 範例程式 6 字串的串接 2 // 程式名稱 :ch07_stringconcatenate.java 11 String s1 = new String(" 我愛喝 "); 12 String s2 = new String("Java"); 13 14 String s3 = s1 + s2 + " 咖啡!"; 15 16 String s4; 17 s4 = s1.concat(s2); 18 s4 = s4.concat(" 咖啡!"); 19 20 System.out.println("s3=" + s3); 21 System.out.println("s4=" + s4); 執行結果 s3= 我愛喝 Java 咖啡! s4= 我愛喝 Java 咖啡! 28
7.3.7 字串的搜尋與取代 字串的搜尋 1. 整數 = 字串 1.indexOf( 字串 2); // 在字串 1 中搜尋字串 2 第一次出現之位置, 若找不到, // 則傳回 -1 亦即,indexOf 是從字串的前端往後找, // 找到之後, 傳回所在之位置, 若找不到, 則傳回 -1 2. 整數 = 字串 1.lastIndexOf( 字串 2); // 在字串 1 中搜尋字串 2 最後一次出現之位置, // 若找不到, 則傳回 -1 29
7.3.7 字串的搜尋與取代 範例程式 7 字串的搜尋 2 // 程式名稱 :ch07_indexof.java 10 String s1 = new String(" 我愛喝 Java 咖啡, 你愛喝嗎?"); 11 12 int i = s1.indexof("java"); 13 int j = s1.indexof("java"); 14 int k = s1.lastindexof("java"); 15 int l = s1.indexof(" 愛喝 "); 16 int m = s1.lastindexof(" 愛喝 "); 執行結果 i=-1 j=3 k=3 l=1 m=11 30
7.3.7 字串的搜尋與取代 字串的取代語法 1. 字串 2 = 字串 1.replace( 字元 1, 字元 2); // 將字串 1 中的字元 1 用字元 2 取代後指定給字串 2, // 這個取代動作不會改變字串 1 的值 2. 字串 2 = 字串 1.replace( 子字串 1, 子字串 2); // 將字串 1 中的子字串 1 用子字串 2 取代後指定給字串 2 // 這個取代動作不會改變字串 1 的值 31
7.3.7 字串的搜尋與取代 範例程式 8 字串的取代 2 // 程式名稱 :ch07_replace.java 10 String s1 = new String("I love Java coffee."); 11 String s2 = new String(s1.replace('e','E')); 12 String s3 = new String(); 13 s3 = s1.replace("java","java"); 14 執行結果 15 System.out.println("s1=" + s1); s1=i love Java coffee. 16 System.out.println("s2=" + s2); s2=i love Java coffee. 17 System.out.println("s3=" + s3); s3=i love JAVA coffee. 32
7.3.8 字串的大小寫轉換 字串的大小寫轉換語法 1. 字串 2 = 字串 1.toLowerCase(); 2. 字串 2 = 字串 1.toUpperCase(); 33
7.3.8 字串的大小寫轉換 範例程式 9 將字串裡的所有字元轉換成大寫 / 小寫 2 // 程式名稱 :ch07_touppercase.java 10 String s1 = new String(" 我愛喝 java 咖啡!"); 11 String s2, s3; 12 13 s2 = s1.touppercase(); 14 s3 = s2.tolowercase(); 15 16 System.out.println("s1=" + s1); 17 System.out.println("s2=" + s2); 18 System.out.println("s3=" + s3); 執行結果 s1= 我愛喝 java 咖啡! s2= 我愛喝 JAVA 咖啡! s3= 我愛喝 java 咖啡! 34
7.4 StringBuffer 類別 StringBuffer 類別來建立字串緩衝區 StringBuffer 物件的值是可以局部變更 類別物件特徵 String 字串不可以局部改變物件的值 StringBuffer 字串緩衝區可以局部改變物件的值 35
7.4.1 StringBuffer 類別的建構元 項次 String 類別的建構元 1 StringBuffer() 2 StringBuffer(CharSequence seq) 3 StringBuffer(int capacity) 4 StringBuffer(String str) 36
7.4.2 StringBuffer 類別提供的方法 項次 String 類別的方法說明 1 2 3 4 5 StringBuffer append(string str) StringBuffer insert(int offset, String str) StringBuffer delete(int start, int end) StringBuffer replace(int start, int end, String str) void setlength(int newlength) 將字串 str 插入到原字串緩衝區之尾端 將字串 str 插入到字串緩衝區的 offset 位置 將字串緩衝區的第 start 到第 end-1 位置的字串刪除 將字串緩衝區的第 start 到第 end-1 位置用 str 字串取代 重新設定字串緩衝區的長度為 newlength 37
7.4.3 建立字串緩衝區 範例程式 10 建立字串緩衝區 2 // 程式名稱 :ch07_stringbuffer.java 10 StringBuffer s1 = new StringBuffer(); 11 System.out.println("s1 的其長度為 " + s1.length() + 12 ", 所佔記憶體大小為 " + s1.capacity()); 13 s1.insert(0, " 我愛喝 java 咖啡!"); 14 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length() + 15 ", 所佔記憶體大小為 " + s1.capacity()); 16 17 StringBuffer s2 = new StringBuffer(" 我愛喝 java 咖啡!"); 18 System.out.println("s2=\"" + s2 + "\", 其長度為 " + s2.length() + 19 ", 所佔記憶體大小為 " + s2.capacity()); 38
7.4.3 建立字串緩衝區 21 StringBuffer s3 = new StringBuffer(20); 22 System.out.println("s3 的其長度為 " + s3.length() + 23 ", 所佔記憶體大小為 " + s3.capacity()); 24 s3.insert(0, " 我愛喝 java 咖啡!"); 25 System.out.println("s3=\"" + s3 + "\", 其長度為 " + s3.length() + 26 ", 所佔記憶體大小為 " + s3.capacity()); 27 28 s3.setlength(30); 29 System.out.print("s3=\"" + s3 + "\", 其長度為 " + s3.length()); 執行結果 s1 的其長度為 0, 所佔記憶體大小為 16 s1=" 我愛喝 java 咖啡!", 其長度為 10, 所佔記憶體大小為 16 s2=" 我愛喝 java 咖啡!", 其長度為 10, 所佔記憶體大小為 26 s3 的其長度為 0, 所佔記憶體大小為 20 s3=" 我愛喝 java 咖啡!", 其長度為 10, 所佔記憶體大小為 20 s3=" 我愛喝 java 咖啡! ", 其長度為 30 39
7.4.4 將字串插入字串緩衝區 範例程式 11 將字串插入字串緩衝區 2 // 程式名稱 :ch07_sb_ins_append.java 10 StringBuffer s1 = new StringBuffer(" 我愛喝 "); 11 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 12 13 s1.append(" 咖啡!"); 14 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 15 16 s1.insert(3, "java"); 17 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 執行結果 s1=" 我愛喝 ", 其長度為 3 s1=" 我愛喝咖啡!", 其長度為 6 s1=" 我愛喝 java 咖啡!", 其長度為 10 40
7.4.5 取代及刪除字串緩衝區裡的文字 範例程式 12 取代及刪除自串緩衝區裡的文字 2 // 程式名稱 :ch07_sb_replace_del.java 10 StringBuffer s1 = new StringBuffer(" 我愛喝 java 咖啡!"); 11 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 13 s1.replace(3, 7, "JAVA"); 14 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 16 s1.delete(3, 7); 17 System.out.println("s1=\"" + s1 + "\", 其長度為 " + s1.length()); 執行結果 s1=" 我愛喝 java 咖啡!", 其長度為 10 s1=" 我愛喝 JAVA 咖啡!", 其長度為 10 s1=" 我愛喝咖啡!", 其長度為 6 41
7.5 綜合練習 7.5.1 比較兩字串是否相同 7.5.2 單字的擷取 42
7.5.1 比較兩字串是否相同 int compareto(string anotherstring) //Compares two strings lexicographically. 43
7.5.2 單字的擷取 有一個字串 s 之內容為 : "Whatever a man sows,that he will also reap. ( 人種的是什麼, 收的也是什麼 ) 我們可以從中擷取出 Whatever a man sows that he will also reap 等 9 個單字 44
7.6 後記 String 類別用來產生字串物件, 一旦指定字串物件的值之後, 除非重新指定, 否則就不可以局部更改它的值 StringBuffer 類別則是用來產生字串緩衝區物件, 字串緩衝區物件的值則是可以局部更改類別是由資料成員和成員函式所封裝而成, 資料成員用來描述類別的屬性特徵, 而成員函式 ( 又稱為方法 ) 則可以對類別所產生的物件進行操作類別的眾多方法中有一個 ( 或多個 ) 特別的方法稱為建構元, 它有兩個特徵 : 它的名稱必須和類別名稱相同它用來產生新的物件 45