開始講解之前,先列出本章的提綱,如下圖所示: 5.1 String類 5.1.1 聲明字元串 5.1.2 創建字元串 輸出結果如下圖所示: 5.2 連接字元串 5.2.1 連接多個字元串 註意事項:Java中一句相連的字元串不能分開在兩行中寫,如下圖所示 可以看出,這種寫法是錯誤,無法編譯通過,如果 ...
開始講解之前,先列出本章的提綱,如下圖所示:
5.1 String類
5.1.1 聲明字元串
String str;
5.1.2 創建字元串
String str1 = new String("student"); System.out.println(str1); char a[] = {'s', 't', 'u', 'd', 'e', 'n', 't'}; String str2 = new String(a); System.out.println(str2); char b[] = {'s', 't', 'u', 'd', 'e', 'n', 't'}; String str3 = new String(b, 2, 4); System.out.println(str3); // 字元串常量 String str4 = "We are students"; String str5 = "We are students"; System.out.println(str4 == str5); // str4與str5引用相同的記憶體地址
輸出結果如下圖所示:
5.2 連接字元串
5.2.1 連接多個字元串
String str1 = new String("hello"); String str2 = new String("world"); String str = str1 + " " + str2; System.out.println(str); // 輸出hello world
註意事項:Java中一句相連的字元串不能分開在兩行中寫,如下圖所示
可以看出,這種寫法是錯誤,無法編譯通過,如果一個字元串過長,為了便於閱讀,想將這個字元串分在兩行上書寫,此時可以使用“+”將兩個字元串連接起來,之後在加號處換行,如下麵語句所示:
System.out.println("I like " + "Java");
5.2.2 連接其他數據類型
int booktime = 4; float practice = 2.5f; System.out.println("我每天花費" + booktime + "小時看書;" + practice + "小時上機練習");
輸出結果如下圖所示:
5.3 獲取字元串信息
5.3.1 獲取字元串長度
String str = "We are students"; int size = str.length(); System.out.println(size); // 輸出15
5.3.2 字元串查找
indexOf():返回搜索的字元或者字元串在字元串中首次出現的位置,如果沒有檢索到,則返回-1。
lastIndexOf():返回搜索的字元或者字元串在字元串中最後一次出現的位置,如果沒有檢索到,則返回-1。
String str = "We are students"; int size = str.indexOf("a"); System.out.println(size); // 輸出3 size = str.indexOf("o"); System.out.println(size); // 輸出-1 size = str.indexOf(""); System.out.println(size); // 輸出0
String str = "We are students"; int size = str.lastIndexOf("s"); System.out.println(size); // 輸出14 size = str.lastIndexOf("o"); System.out.println(size); // 輸出-1 size = str.lastIndexOf(""); System.out.println(size); // 輸出15
註意事項:如果lastIndexOf()方法中的參數是空字元串""(註意沒有空格),則返回的結果與調用該字元串的length()方法的返回結果相同。
5.3.3 獲取指定索引位置的字元
String str = "hello world"; char myChar = str.charAt(6); System.out.println("字元串str中索引位置是6的字元為:" + myChar);
輸出結果如下圖所示:
5.4 字元串操作
5.4.1 獲取子字元串
String str = "hello world"; String substr = str.substring(3); // lo world System.out.println(substr); substr = str.substring(0, 3); System.out.println(substr); // hel,不包括endIndex
註意事項:在字元串中空格占用一個索引位置。
5.4.2 去除空格
String str = " Java class "; System.out.println("字元串原來的長度:" + str.length()); // 去掉str的前導和尾部的空格 System.out.println("去掉空格後的長度:" + str.trim().length());
輸出結果如下圖所示:
5.4.3 字元串替換
String str = "address"; String newStr = str.replace("a", "A"); System.out.println(newStr); // 輸出Address
說明:
1.如果要替換的字元在字元串中沒有出現,則將原字元串返回
2.如果要替換的字元在字元串中重覆出現多次,會將要替換的字元全部替換為新字元
3.要替換的字元的大小寫要與原字元串中字元的大小寫保持一致,否則不能成功的替換
String str = "address"; String newStr = str.replace("b", "B"); System.out.println(newStr); // 輸出address newStr = str.replace("d", "D"); System.out.println(newStr); // 輸出aDDress newStr = str.replace("A", "B"); System.out.println(newStr); // 輸出address
5.4.4 判斷字元串的開始與結尾
String num1 = "22045612"; String num2 = "21304578"; boolean b1 = num1.startsWith("22"); boolean b2 = num1.endsWith("78"); boolean b3 = num2.startsWith("22"); boolean b4 = num2.endsWith("78"); System.out.println("字元串num1是以'22'開始的嗎?" + b1); System.out.println("字元串num1是以'78'結束的嗎?" + b2); System.out.println("字元串num2是以'22'開始的嗎?" + b3); System.out.println("字元串num2是以'78'結束的嗎?" + b4);
輸出結果如下圖所示:
5.4.5 判斷字元串是否相等
對字元串對象進行比較不能簡單地使用比較運算符"==",因為比較運算符比較的是兩個字元串的地址是否相同。即使兩個字元串的內容相同,兩個對象的記憶體地址也可能是不同的,使用比較運算符仍然會返回false。
因此,要比較兩個字元串內容是否相等,應使用equals()方法和equalsIgnoreCase()方法。
String s1 = new String("abc"); String s2 = new String("ABC"); String s3 = new String("abc"); String s4 = "abc"; String s5 = "abc"; boolean b1 = s1.equals(s2); boolean b2 = s1.equalsIgnoreCase(s2); boolean b3 = s1.equals(s3); boolean b4 = s1 == s3; boolean b5 = s4 == s5; System.out.println(s1 + " equals " + s2 + ":" + b1); System.out.println(s1 + " equalsIgnoreCase " + s2 + ":" + b2); System.out.println(s1 + " equals " + s3 + ":" + b3); System.out.println(s1 + " == " + s3 + ":" + b4); System.out.println(s4 + " == " + s5 + ":" + b5);
輸出結果如下圖所示:
5.4.6 按字典順序比較兩個字元串
compareTo()方法為按字典順序比較兩個字元串,該比較基於字元串中各個字元的Unicode值,按字典順序將此String對象表示的字元序列與參數字元串所表示的字元序列進行比較。
如果按字典順序此String對象位於參數字元串之前,則比較結果為一個負整數。
如果按字典順序此String對象位於參數字元串之後,則比較結果為一個正整數。
如果這兩個字元串相等,則比較結果為0。
String str = new String("b"); String str2 = new String("a"); String str3 = new String("c"); String str4 = new String("b"); System.out.println(str + " compareTo " + str2 + ":" + str.compareTo(str2)); System.out.println(str + " compareTo " + str3 + ":" + str.compareTo(str3)); System.out.println(str + " compareTo " + str4 + ":" + str.compareTo(str4));
輸出結果如下圖所示:
說明:compareTo()方法只有在equals(Object)方法返回true時才返回0。
5.4.7 字母大小寫轉換
String str = new String("abc DEF"); String newStr = str.toLowerCase(); String newStr2 = str.toUpperCase(); System.out.println(newStr); // abc def System.out.println(newStr2); // ABC DEF
說明:使用toLowerCase()方法和toUpperCase()方法進行大小寫轉換時,數字或非字元不受影響。
5.4.8 字元串分割
String str = "192.168.0.1"; String[] firstArray = str.split("\\."); String[] secondArray = str.split("\\.", 2); System.out.println("str的原值為:[" + str + "]"); System.out.println("全部分割的結果:"); for (String a : firstArray) { System.out.print("[" + a + "]"); } System.out.println(); System.out.println("分割兩次的結果:"); for (String a : secondArray) { System.out.print("[" + a + "]"); } System.out.println();
輸出結果如下圖所示:
5.5 格式化字元串
5.5.1 日期和時間字元串格式化
Date date = new Date(); String year = String.format("%tY", date); String month = String.format("%tB", date); String day = String.format("%td", date); String hour = String.format("%tH", date); String minute = String.format("%tM", date); String second = String.format("%tS", date); String form = String.format("%tF", date); System.out.println("今年是:" + year + "年"); System.out.println("現在是:" + month); System.out.println("今天是:" + day + "號"); System.out.println("現在是:" + hour + "時" + minute + "分" + second + "秒"); System.out.println("年-月-日格式:" + form);
輸出結果如下圖所示:
5.5.2 常規類型格式化
String str = String.format("%d", 400 / 2); String str2 = String.format("%b", 3 > 5); String str3 = String.format("%x", 200); System.out.println("400的一半是:" + str); System.out.println("3 > 5正確嗎:" + str2); System.out.println("200的十六進位數是:" + str3);
輸出結果如下圖所示:
5.6 使用正則表達式
正則表達式通常被用於判斷語句中,用來檢查某一字元串是否滿足某一格式,正則表達式是含有一些具有特殊意義字元的字元串,這些特殊字元稱為正則表達式的元字元。
以下表格為常用的元字元:
元字元 | 正則表達式中的寫法 | 意義 |
. | . | 代表任意一個字元 |
\d | \\d | 代表0~9的任何一個數字 |
\D | \\D | 代表任何一個非數字字元 |
\s | \\s | 代表空白字元,如'\t','\n' |
\S | \\S | 代表非空白字元 |
\w | \\w | 代表可用作標識符的字元,但不包括"$" |
\W | \\W | 代表不可用於標識符的字元 |
\p{Lower} | \\p{Lower} | 代表小寫字母a~z |
\p{Upper} | \\p{Upper} | 代表大寫字母A~Z |
\p{ASCII} | \\p{ASCII} | ASCII字元 |
\p{Digit} | \\p{Digit} | 十進位數字,即0~9 |
\p{Blank} | \\p{Blank} | 空格或製表符\t |
說明:在正則表達式中"."代表任何一個字元,因此在正則表達式中如果想使用普通意義的點字元".",必須使用轉義字元"\" 。
在正則表達式中可以使用方括弧括起若幹個字元來表示一個元字元,該元字元可代表方括弧中的任何一個字元。
例如,[abc]4,字元串a4,b4,c4都是匹配的字元串。方括弧元字元還可以為其他格式,如:
[^456]:代表4、5、6之外的任何字元。
[a-r]:代表a~r中的任何一個字母。
[a-zA-Z]:代表任意一個英文字母。
在正則表達式中,允許使用限定修飾符來限定元字元出現的次數。
限定修飾符的用法如下表所示:
限定修飾符 | 意義 | 示例 |
? | 0次或1次 | A? |
* | 0次或多次 | A* |
+ | 1次或多次 | A+ |
{n} | 正好出現n次 | A{2} |
{n,} | 至少出現n次 | A{3,} |
{n,m} | 出現n~m次 | A{2,6} |
String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}"; String str1 = "aaa@"; String str2 = "aaaaa"; String str3 = "[email protected]"; if (str1.matches(regex)) { System.out.println(str1 + "是一個合法的E-mail地址格式"); } if (str2.matches(regex)) { System.out.println(str2 + "是一個合法的E-mail地址格式"); } if (str3.matches(regex)) { System.out.println(str3 + "是一個合法的E-mail地址格式"); }
運行結果如下圖所示:
5.7 字元串生成器
String str = ""; long startTime = System.currentTimeMillis(); for (int i = 0; i < 10000; i++) { str = str + i; } long endTime = System.currentTimeMillis(); long time = endTime - startTime; System.out.println("String消耗時間:" + time); StringBuilder builder = new StringBuilder(""); startTime = System.currentTimeMillis(); for (int j = 0; j < 10000; j++) { builder.append(j); } endTime = System.currentTimeMillis(); time = endTime - startTime; System.out.println("StringBuilder消耗時間:" + time);
運行結果如下圖所示:
通過運行的耗時可以看出,如果在程式中需要頻繁的附加字元串,建議使用StringBuilder。
StringBuilder bf = new StringBuilder("hello"); bf.insert(5, "world"); System.out.println(bf.toString()); // 輸出helloworld bf = new StringBuilder("StringBuilder"); bf.delete(5, 10); System.out.println(bf.toString()); // 輸出Strinder