String類的概述和使用
12.1 String類的概念(重點)
java.lang.String類用於描述字串,Java程式中所有的字串字面值都可以使用該類的物件加以描述,如:"abc"。
該類由final關鍵字修飾,表示該類不能被繼承。
從jdk1.9開始該類的底層不使用char[]來儲存資料,而是改成 byte[]加上編碼標記,從而節約了一些空間。
該類描述的字串內容是個常量不可更改,因此可以被共享使用。
如:
String str1 = “abc”; - 其中"abc"這個字串是個常量不可改變。
str1 = “123”; - 將“123”字串的地址賦值給變數str1。
- 改變str1的指向並沒有改變指向的內容
12.2 常量池的概念(原理)
由於String型別描述的字串內容是常量不可改變,因此Java虛擬機器將首次出現的字串放入常量池中,若後續程式碼中出現了相同字串內容則直接使用池中已有的字串物件而無需申請記憶體及建立物件,從而提高了效能。
public class StringExample {
public static void main(String[] args) {
//String str1 = "hello";//1個物件,存放在常量池中
//String str2 = new String("hello");//2個物件,1個在常量池(hello),1個在堆區
//2.常量池與堆區物件的比較
String str1 = "hello";//常量池
String str2 = "hello";//常量池
String str3 = new String("hello");//堆區
String str4 = new String("hello");//堆區
System.out.println(str1 == str2);//比較地址
System.out.println(str1.equals(str2));//比較內容
System.out.println(str3 == str4);//比較地址
System.out.println(str3.equals(str2));//比較內容
System.out.println(str2 == str4);//比較地址
System.out.println(str2.equals(str4));//比較內容
System.out.println("-----------------------------");
//3.常量有優化機制,變數沒有
String str5 = "abcd";
String str6 = "ab" + "cd";//常量優化機制
System.out.println(str5 == str6);//比較地址 true
System.out.println(str5.equals(str6));//比較內容
String str7 = "ab";
String str8 = str7 + "cd";//變數沒有優化機制
System.out.println(str5 == str8);//false
}
}
12.3 常用的構造方法(練熟、記住)
方法宣告 |
功能介紹 |
String() |
使用無參方式構造物件得到空字元序列 |
String(byte[] bytes, int offset, int length) |
使用bytes陣列中下標從offset位置開始的length個位元組來構造物件 |
String(byte[] bytes) |
使用bytes陣列中的所有內容構造物件 |
String(char[] value, int offset, int count) |
使用value陣列中下標從offset位置開始的count個字元來構造物件 |
String(char[] value) |
使用value陣列中的所有內容構造物件 |
String(String original) |
根據引數指定的字串內容來構造物件,新建立物件為引數物件的副本 |
12.4 常用的成員方法(練熟、記住)
方法宣告 |
功能介紹 |
|
String toString() |
返回字串本身 |
|
byte[] getBytes() |
將當前字串內容轉換為byte陣列並返回 |
|
char[] toCharArray() |
用於將當前字串內容轉換為char陣列並返回 |
|
方法宣告 |
功能介紹 |
|
char charAt(int index) |
方法charAt用於返回字串指定位置的字元。 |
|
int length() |
返回字串字元序列的長度 |
|
boolean isEmpty() |
判斷字串是否為空 |
|
案例題目
判斷字串“上海自來水來自海上”是否為迴文並列印,所謂迴文是指一個字元序列無論從左向右讀還是從右向左讀都是相同的句子。
public class StringJudge {
public static void main(String[] args) {
//建立字串物件
String str1 = new String("上海自來水來自海上");
System.out.println("str1 = " + str1);
//判斷是否沒回文並列印
for (int i = 0; i < str1.length()/2; i ++) {
if (str1.charAt(i) != str1.charAt(str1.length()-i-1)) {
System.out.println(str1 + "不是迴文!");
return;//實現方法的結束,不需要返回值
}
}
System.out.println(str1 + "是迴文!");
}
}
方法宣告 |
功能介紹 |
int compareTo(String anotherString) |
用於比較呼叫物件和引數物件的大小關係 |
int compareToIgnoreCase(String str) |
不考慮大小寫,也就是'a'和'A'是相等的關係 |
案例題目
程式設計實現字串之間大小的比較並列印。
public class StringCompareTest {
public static void main(String[] args) {
//構造String型別的物件並列印
String str1 = new String("hello");
System.out.println("str1 = " + str1);
//使用構造好的物件與其他的字串物件進行比較大小並列印
System.out.println(str1.compareTo("world"));
System.out.println(str1.compareTo("haha"));
System.out.println(str1.compareTo("hehe"));
System.out.println(str1.compareTo("heihei"));
System.out.println(str1.compareTo("helloworld"));
System.out.println(str1.compareToIgnoreCase("HELLO"));
}
}
方法宣告 |
功能介紹 |
String concat(String str) |
用於實現字串的拼接 |
boolean contains(CharSequence s) |
用於判斷當前字串是否包含引數指定的內容 |
String toLowerCase() |
返回字串的小寫形式 |
String toUpperCase() |
返回字串的大寫形式 |
String trim() |
返回去掉前導和後繼空白的字串 |
boolean startsWith(String prefix) |
判斷字串是否以引數字串開頭 |
boolean startsWith(String prefix, int toffset) |
從指定位置開始是否以引數字串開頭 |
boolean endsWith(String suffix) |
判斷字串是否以引數字串結尾 |
案例題目
程式設計實現上述方法的使用。
方法宣告 |
功能介紹 |
boolean equals(Object anObject) |
用於比較字串內容是否相等並返回 |
int hashCode() |
獲取呼叫物件的雜湊碼值 |
boolean equalsIgnoreCase(String anotherString) |
用於比較字串內容是否相等並返回,不考慮大小寫,如:'A'和'a'是相等 |
案例題目
提示使用者從鍵盤輸入使用者名稱和密碼資訊,若輸入”admin”和”123456”則提示“登入成功,歡迎使用”,否則提示“使用者名稱或密碼錯誤,您還有n次機會”,若使用者輸入三次後依然錯誤則提示“賬戶已凍結,請聯絡客服人員!”
import java.util.Scanner;
public class StringEqualsTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i = 3; i > 0; i --) {
//1 提示使用者從鍵盤輸入使用者名稱和密碼資訊並使用變數記錄
System.out.println("請輸入您的使用者和密碼資訊:");
String userName = sc.next();
String passWord = sc.next();
//2 判斷使用者名稱和密碼是否為“admin”和“123456”
if ("admin".equals(userName) && "123456".equals(passWord)) {
System.out.println("登入成功,歡迎使用!");
break;
}
if (1 == i) {
System.out.println("賬戶已凍結,請聯絡客服人員!");
} else {
System.out.println("使用者名稱或密碼錯誤,您還有" + (i-1) + "次機會!");
}
}
sc.close();
}
}
方法宣告 |
功能介紹 |
int indexOf(int ch) |
用於返回當前字串中引數ch指定的字元第一次出現的下標 |
int indexOf(int ch, int fromIndex) |
用於從fromIndex位置開始查詢ch指定的字元 |
int indexOf(String str) |
在字串中檢索str返回其第一次出現的位置,若找不到返回-1 |
int indexOf(String str, int fromIndex) |
表示從字串的fromIndex位置開始檢索str第一次出現的位置 |
int lastIndexOf(int ch) |
用於返回引數ch指定的字元 後一次出現的下標 |
int lastIndexOf(int ch, int fromIndex) |
用於從fromIndex位置開始查詢ch指定字元出現的下標 |
int lastIndexOf(String str) |
返回str指定字串 後一次出現的下標 |
int lastIndexOf(String str, int fromIndex) |
用於從fromIndex位置開始反向搜尋的第一次出現的下標。 |
案例題目
編寫通用的程式碼可以查詢字串"Good Good Study, Day Day Up!"中所有"Day"出現的索引位置並打印出來。
方法宣告 |
功能介紹 |
String substring(int beginIndex, int endIndex) |
返回字串中從下標beginIndex(包括)開始到 endIndex(不包括)結束的子字串 |
String substring(int beginIndex) |
返回字串中從下標beginIndex(包括)開始到字串結尾的子字串 |
案例題目
提示使用者從鍵盤輸入一個字串和一個字元,輸出該字元(不含)後面的所有子字串。
12.5 正則表示式的概念(瞭解)
正則表示式本質就是一個“規則字串”,可以用於對字串資料的格式進行驗證,以及匹配、查
找、替換等操作。該字串通常使用^運算子作為開頭標誌,使用$運算子作為結尾標誌,當然也可以省略。
12.6 正則表示式的規則(瞭解)
正則表示式 |
說明 |
||
[abc] |
可以出現a、b、c中任意一個字元 |
||
[^abc] |
可以出現任何字元,除了a、b、c的任意字元 |
||
[a-z] |
可以出現a、b、c、……、z中的任意一個字元 |
||
[a-zA-Z0-9] |
可以出現a~z、A~Z、0~9中任意一個字元 |
||
正則表示式 |
說明 |
||
. |
任意一個字元(通常不包含換行符) |
||
\d |
任意一個數字字元,相當於[0-9] |
||
\D |
任意一個非數字字元 |
||
\s |
空白字元,相當於[\t\n\x0B\f\r] |
||
\S |
非空白字元 |
||
\w |
任意一個單詞字元,相當於[a-zA-Z_0-9] |
||
\W |
任意一個非單詞字元 |
||
正則表示式 |
說明 |
||
X? |
表示X可以出現一次或一次也沒有,也就是0 ~ 1次 |
||
X* |
表示X可以出現零次或多次,也就是0 ~ n次 |
||
X+ |
表示X可以出現一次或多次,也就是1 ~ n次 |
||
X{n} |
表示X可以出現恰好 n 次 |
||
X{n,} |
表示X可以出現至少 n 次,也就是>=n次 |
||
X{n,m} |
表示X可以出現至少 n 次,但是不超過 m 次,也就是>=n並且<=m次 |
||
12.7 正則表示式相關的方法(熟悉)
方法名稱 |
方法說明 |
boolean matches(String regex) |
判斷當前正在呼叫的字串是否匹配引數指定的正則表示式規則 |
案例題目
使用正則表示式描述一下銀行卡密碼的規則:要求是由6位數字組成。
使用正則表示式描述一下QQ號碼的規則:要求是由非0開頭的5~15位陣列成。
使用正則表示式描述一下手機號碼的規則:要求是由1開頭,第二位數是3、4、5、7、8中的一位,總共11位
描述身份證號碼的規則:總共18位,6位數字代表地區,4位數字代表年,2位數字代表月,2位數字代表日期, 3位數字代表個人, 後一位可能數字也可能是X。
import java.util.Scanner;
public class StringRegTest {
public static void main(String[] args) {
// 定義描述規則的正則表示式字串並使用變數記錄
// 1.銀行卡密碼規則
String reg = "^[0-9]{6}$";
// String reg1 = "^\\d{6}$";
// 2.QQ號規則,開頭非0的5-15位數字;
String reg1 = "^[1-9]\\d{4,14}$";
// 3.手機號規則,開頭是1,第二位是3,4,5,6,7,8 中的一位,總共11位數字;
String reg3 = "^1[345678]\\d{9}$";
// 4.身份號規則,:總共18位,6位數字代表地區,4位數字代表年,2位數字代表月,2位數 字代表日期,
// 3位數字代表個人,後一位可能數字也可能是X
String reg4 = "(^\\d{6})(\\d{4})(\\d{2})(\\d{3})([0-9|X]$)";
Scanner sc = new Scanner(System.in);
// 提示使用者從鍵盤輸入指定的內容並使用變數記錄
while (true) {
System.out.println("請輸入密碼:");
String str = sc.next();
// 判斷使用者輸入的字串內容是否滿足指定規則並列印
if (str.matches(reg)) {
System.out.println("密碼輸入正確");
break;
} else {
System.out.println("密碼格式輸入錯誤");
}
}
}
}
方法名稱 |
方法說明 |
String[] split(String regex) |
引數regex為正則表示式,以regex所表示的字串為分隔符,將字串拆分成字串陣列 |
String replace(char oldChar, char newChar) |
使用引數newChar替換此字串中出現的所有引數 oldChar |
String replaceFirst(String regex, String replacement) |
替換此字串匹配給定的正則表示式的第一個子字串 |
String replaceAll(String regex, String replacement) |
將字串中匹配正則表示式regex的字串替換成 replacement |