來(lái)自拉鉤教育-JAVA就業(yè)集訓(xùn)營(yíng)
String類的概述和使用
String類的概念(重點(diǎn))
java.lang.String類用于描述字符串摔桦,Java程序中所有的字符串字面值都可以使用該類的對(duì)象加以描述懂算,如:"abc"值戳。
該類由final關(guān)鍵字修飾虫埂,表示該類不能被繼承主届。
從jdk1.9開(kāi)始該類的底層不使用char[]來(lái)存儲(chǔ)數(shù)據(jù)厂抽,而是改成 byte[]加上編碼標(biāo)記羡蛾,從而節(jié)約了一些空間。
該類描述的字符串內(nèi)容是個(gè)常量不可更改眷茁,因此可以被共享使用炕泳。
-
如:
- String str1 = “abc”; - 其中"abc"這個(gè)字符串是個(gè)常量不可改變。
- str1 = “123”;
- 將“123”字符串的地址賦值給變量str1蔼卡。
- 改變str1的指向并沒(méi)有改變指向的內(nèi)容
常量池的概念(原理)
- 由于String類型描述的字符串內(nèi)容是常量不可改變喊崖,因此Java虛擬機(jī)將首次出現(xiàn)的字符串放入常量池中挣磨,若后續(xù)代碼中出現(xiàn)了相同字符串內(nèi)容則直接使用池中已有的字符串對(duì)象而無(wú)需申請(qǐng)內(nèi)存及創(chuàng)建對(duì)象雇逞,從而提高了性能。
package com.lagou.task12;
public class StringPoolTest {
public static void main(String[] args) {
// 1.驗(yàn)證一下常量池的存在
// 到此為止茁裙,只有String這個(gè)特殊類除了new的方式外還可以直接使用字符串賦值(包裝類除外)
String str1 = "abc";
String str2 = "abc";
// 兩個(gè)對(duì)象正常地址是不相等的塘砸。有常量池的話地址就是同一個(gè)地址
System.out.println(str1 == str2); // 比較地址 true
}
}
常用的構(gòu)造方法(練熟、記孜钭丁)
方法聲明 |
功能介紹 |
String() |
使用無(wú)參方式構(gòu)造對(duì)象得到空字符序列 |
String(byte[] bytes, int offset, intlength) |
使用bytes數(shù)組中下標(biāo)從offset位置開(kāi)始的length個(gè)字節(jié)來(lái)構(gòu)造對(duì)象 |
String(byte[] bytes) |
使用bytes數(shù)組中的所有內(nèi)容構(gòu)造對(duì)象 |
String(char[] value, int offset, intcount) |
使用value數(shù)組中下標(biāo)從offset位置開(kāi)始的count個(gè)字符來(lái)構(gòu)造對(duì)象 |
String(char[] value) |
使用value數(shù)組中的所有內(nèi)容構(gòu)造對(duì)象 |
String(String original) |
根據(jù)參數(shù)指定的字符串內(nèi)容來(lái)構(gòu)造對(duì)象掉蔬,新創(chuàng)建對(duì)象為參數(shù)對(duì)象的副本 |
package com.lagou.task12;
public class StringConstructorTest {
public static void main(String[] args) {
// 1.使用無(wú)參方式構(gòu)造對(duì)象并打印
String str1 = new String();
// "" 表示空字符串對(duì)象,有對(duì)象只是里面沒(méi)有內(nèi)容
// null 表示空矾瘾,連對(duì)象都沒(méi)有
System.out.println("str1 = " + str1); // 自動(dòng)調(diào)用toString 方法 str1 =
System.out.println("--------------------------------------------------------");
// 2.使用參數(shù)指定的byte數(shù)組來(lái)構(gòu)造對(duì)象并打印
byte[] bArr = {97, 98, 99, 100, 101};
// 使用字節(jié)數(shù)組中的一部分內(nèi)容來(lái)構(gòu)造對(duì)象女轿,表示使用數(shù)組bArr中下標(biāo)從1開(kāi)始的3個(gè)字節(jié)構(gòu)造字符串對(duì)象
// 構(gòu)造字符串的思路:就是先將每個(gè)整數(shù)翻譯成對(duì)應(yīng)的字符,再講所有的字符串起來(lái)壕翩。
// 98 - ‘b’ 99 - 'c' 100 - 'd'
String str2 = new String(bArr, 1, 3);
System.out.println("str2 = " + str2); // bcd
// 使用整個(gè)字節(jié)數(shù)組來(lái)構(gòu)造字符串對(duì)象
String str3 = new String(bArr);
System.out.println("str3 = " + str3); // abcde
System.out.println("--------------------------------------------------------");
// 3.使用字符數(shù)組來(lái)構(gòu)造字符串對(duì)象
char[] cArr = {'h', 'e', 'l', 'l', 'o'};
// 使用數(shù)組中的一部分內(nèi)容來(lái)構(gòu)造對(duì)象
// 思路:直接將字符串起來(lái)
String str4 = new String(cArr, 2, 2);
System.out.println("str4 = " + str4); // null
// 使用整個(gè)字符數(shù)組來(lái)構(gòu)造對(duì)象
String str5 = new String(cArr);
System.out.println("str5 = " + str5); // hello
System.out.println("--------------------------------------------------------");
// 4.使用字符串來(lái)構(gòu)造字符串對(duì)象
String str6 = new String("world");
System.out.println("str6 = " + str6); // world
}
}
package com.lagou.task12;
public class StringExamTest {
public static void main(String[] args) {
// 1.請(qǐng)問(wèn)下面的代碼會(huì)創(chuàng)建幾個(gè)對(duì)象蛉迹?分別存放在什么地方?
// String str1 = "hello"; // 1個(gè)對(duì)象 存放在常量池中
// String str1 = new String("hello"); // 2個(gè)對(duì)象放妈, 一個(gè)在常量池中北救,一個(gè)在堆區(qū)
// 2.常量池和堆區(qū)對(duì)象的比較
String str1 = "hello"; // 常量池
String str2 = "hello"; // 常量池 和str1是一個(gè)對(duì)象
String str3 = new String("hello"); // 堆區(qū)
String str4 = new String("hello"); // 堆區(qū)
System.out.println(str1 == str2); // 比較地址 true
System.out.println(str1.equals(str2)); // 比較內(nèi)容 true
System.out.println(str3 == str4); // 比較地址 false
System.out.println(str3.equals(str4)); // 比較內(nèi)容 true
System.out.println(str2 == str4); // 比較地址 false
System.out.println(str2.equals(str4)); // 比較內(nèi)容 true
System.out.println("-------------------------------------------------");
// 3.常量有優(yōu)化機(jī)制荐操,變量沒(méi)有
String str5 = "abcd";
String str6 = "ab" + "cd"; // 常量?jī)?yōu)化機(jī)制 “abcd”
System.out.println(str5 == str6); // 比較地址 true
System.out.println(str5.equals(str6)); // 比較內(nèi)容 true
String str7 = "ab";
String str8 = str7 + "cd"; // 變量 沒(méi)有常量?jī)?yōu)化機(jī)制 “abcd”
System.out.println(str5 == str8); // 比較地址 false
System.out.println(str5.equals(str8)); // 比較內(nèi)容 true
}
}
常用的成員方法(練熟、記渍洳摺)
方法聲明 |
功能介紹 |
String toString() |
返回字符串本身 |
byte[] getBytes() |
將當(dāng)前字符串內(nèi)容轉(zhuǎn)換為byte數(shù)組并返回 |
char[] toCharArray() |
用于將當(dāng)前字符串內(nèi)容轉(zhuǎn)換為char數(shù)組并返回 |
package com.lagou.task12;
public class StringByteCharTest {
public static void main(String[] args) {
// 1.創(chuàng)建 String 類型的對(duì)象并打印
String str1 = new String("world");
System.out.println("str1 = " + str1); // world
System.out.println("---------------------------------------");
// 2.實(shí)現(xiàn)將String類型轉(zhuǎn)換為byte數(shù)組類型
byte[] bArr = str1.getBytes();
for (int i = 0; i < bArr.length; i++) {
System.out.println("下標(biāo)為" + i + "的元素是" + bArr[i]); // 下標(biāo)為0的元素是119 下標(biāo)為1的元素是111 ……
}
// 將byte數(shù)組轉(zhuǎn)回string類型并打印
String str2 = new String(bArr);
System.out.println("轉(zhuǎn)回字符串為:" + str2); // 轉(zhuǎn)回字符串為:world
System.out.println("---------------------------------------");
// 3.實(shí)現(xiàn)將String類型轉(zhuǎn)換為char數(shù)組類型并打印
// 思路:將字符串拆分為字符并保存到數(shù)組中
char[] cArr = str1.toCharArray();
for (int i = 0; i < cArr.length; i++){
System.out.println("下標(biāo)為" + i + "的元素是" + cArr[i]); // 下標(biāo)為0的元素是w 下標(biāo)為1的元素是o 下標(biāo)為2的元素是r
}
}
}
方法聲明 |
功能介紹 |
char charAt(int index) |
方法charAt用于返回字符串指定位置的字符托启。 |
int length() |
返回字符串字符序列的長(zhǎng)度 |
boolean isEmpty() |
判斷字符串是否為空 |
package com.lagou.task12;
public class StringCharTest {
public static void main(String[] args) {
// 1.構(gòu)造String類型的對(duì)象并打印
String str1 = new String("hello");
System.out.println("str1 = " + str1);
// 2.獲取字符串的長(zhǎng)度和每個(gè)字符并打印
System.out.println("字符串的長(zhǎng)度是:" + str1.length()); // 5
System.out.println("下標(biāo)為0的字符是:" + str1.charAt(0)); // h
System.out.println("下標(biāo)為1的字符是:" + str1.charAt(1)); // e
System.out.println("下標(biāo)為2的字符是:" + str1.charAt(2)); // l
System.out.println("下標(biāo)為3的字符是:" + str1.charAt(3)); // l
System.out.println("下標(biāo)為4的字符是:" + str1.charAt(4)); // o
// System.out.println("下標(biāo)為5的字符是:" + str1.charAt(5)); // StringIndexOutOfBoundsException 字符串下標(biāo)越界異常
System.out.println("-----------------------------------------------");
// 3.使用for循環(huán)獲取所有字符
for (int i = 0; i < str1.length(); i++) {
//下標(biāo)為0的字符是:h 下標(biāo)為1的字符是:e 下標(biāo)為2的字符是:l 下標(biāo)為3的字符是:l 下標(biāo)為4的字符是:o
System.out.println("下標(biāo)為" + i + "的字符是:" + str1.charAt(i));
}
System.out.println("-----------------------------------------------");
// 4.判斷字符串是否為空
System.out.println(0 == str1.length() ? "字符串為空" : "字符串不為空"); // 字符串不為空
System.out.println(str1.isEmpty() ? "字符串為空" : "字符串不為空"); // 字符串不為空
// 5.筆試考點(diǎn)
// 使用兩種范式實(shí)現(xiàn)字符串 “12345” 轉(zhuǎn)換為整數(shù) 12345 并打印
String str2 = new String("12345");
// 方式一:調(diào)用 Integer 類中 parseInt() 方法即可
int ia = Integer.parseInt(str2);
System.out.println("轉(zhuǎn)換出來(lái)的整數(shù)是:" + ia); // 12345
// 方式二:利用 ASCII 來(lái)實(shí)現(xiàn)類型轉(zhuǎn)換并打印
// '1' - '0' => 1 '2' - '0' => 2 ……
int ib = 0;
for (int i = 0; i < str2.length(); i++) {
ib = ib * 10 + (str2.charAt(i) - '0'); // 1 12 ...
}
System.out.println("轉(zhuǎn)換出來(lái)的結(jié)果是:" + ib); // 12345
System.out.println("----------------------------------------");
// 如何實(shí)現(xiàn)整數(shù)到字符串的轉(zhuǎn)換
// String str3 = String.valueOf(ib);
String str3 = "" + ib;
System.out.println("str3 = " + str3); // 12345
}
}
- 案例題目
- 判斷字符串“上海自來(lái)水來(lái)自海上”是否為回文并打印,所謂回文是指一個(gè)字符序列無(wú)論從左向右讀還是從右向左讀都是相同的句子攘宙。
package com.lagou.task12;
public class StringJudgeTest {
public static void main(String[] args) {
// 1.創(chuàng)建字符串對(duì)象并打印
String str1 = new String("上海自來(lái)水來(lái)自海上");
System.out.println("str1 = " + str1); // 上海自來(lái)水來(lái)自海上
// 2.判斷該字符串內(nèi)容是否為回文并打印
for (int i = 0; i < str1.length() / 2; i++){
if (str1.charAt(i) != str1.charAt(str1.length() - i - 1)){ // 0和8 1和7 2和6 3和5
System.out.println(str1 + "不是回文屯耸!");
return; // 僅僅是用于實(shí)現(xiàn)方法的結(jié)束
}
}
System.out.println(str1 + "是回文!");
}
}
方法聲明 |
功能介紹 |
int compareTo(String anotherString) |
用于比較調(diào)用對(duì)象和參數(shù)對(duì)象的大小關(guān)系 |
int compareToIgnoreCase(String str) |
不考慮大小寫(xiě)蹭劈,也就是'a'和'A'是相等的關(guān)系 |
- 案例題目
- 編程實(shí)現(xiàn)字符串之間大小的比較并打印肩民。
package com.lagou.task12;
public class StringCompareTest {
public static void main(String[] args) {
// 1.構(gòu)造string類型的對(duì)象并打印
String str1 = new String("hello");
System.out.println("str1 = " + str1); // hello
// 2.使用構(gòu)造好的對(duì)象與其它字符串對(duì)象之間比較大小并打印
System.out.println(str1.compareTo("world")); // 'h' - 'w' => 104 - 119 => -15
System.out.println(str1.compareTo("haha")); // 'e' - 'a' => 101 - 97 => 4
System.out.println(str1.compareTo("hehe")); // 'l' - 'h' => 108 - 104 => 4
System.out.println(str1.compareTo("heihei")); // 'l' - 'i' => 108 - 105 => 3
System.out.println(str1.compareTo("helloworld")); // 一樣的比長(zhǎng)度 5 - 10 => -5
System.out.println(str1.compareToIgnoreCase("HELLO")); // 0
}
}
方法聲明 |
功能介紹 |
String concat(String str) |
用于實(shí)現(xiàn)字符串的拼接 |
boolean contains(CharSequence s) |
用于判斷當(dāng)前字符串是否包含參數(shù)指定的內(nèi)容 |
String toLowerCase() |
返回字符串的小寫(xiě)形式 |
String toUpperCase() |
返回字符串的大寫(xiě)形式 |
String trim() |
返回去掉前導(dǎo)和后繼空白的字符串 |
boolean startsWith(String prefix) |
判斷字符串是否以參數(shù)字符串開(kāi)頭 |
boolean startsWith(String prefix, int toffset) |
從指定位置開(kāi)始是否以參數(shù)字符串開(kāi)頭 |
boolean endsWith(String suffix) |
判斷字符串是否以參數(shù)字符串結(jié)尾 |
package com.lagou.task12;
public class StringManyMethodTest {
public static void main(String[] args) {
// 1.構(gòu)造string類型的對(duì)象并打印
String str1 = new String(" Let Me Give You Some Color To See See!");
System.out.println("str1 = " + str1); // Let Me Give You Some Color To See See!
// 2.實(shí)現(xiàn)各種成員方法的調(diào)用和測(cè)試
boolean b1 = str1.contains("some");
System.out.println("b1 = " + b1); // b1 = false 區(qū)分大小寫(xiě)
b1 = str1.contains("Some");
System.out.println("b1 = " + b1); // b1 = true
System.out.println("-------------------------------------");
// 將所有字符串轉(zhuǎn)換為大寫(xiě) 小寫(xiě) 以及去除兩邊的空白符
String str2 = str1.toUpperCase();
System.out.println("str2 = " + str2); // LET ME GIVE YOU SOME COLOR TO SEE SEE!
System.out.println("str1 = " + str1); // Let Me Give You Some Color To See See! 常量
String str3 = str1.toLowerCase();
System.out.println("str3 = " + str3); // let me give you some color to see see!
System.out.println("str1 = " + str1); // Let Me Give You Some Color To See See! 常量
String str4 = str1.trim();
System.out.println("str4 = " + str4); //Let Me Give You Some Color To See See!
System.out.println("-------------------------------------");
// 判斷字符串是否以...開(kāi)頭 以...結(jié)尾
b1 = str1.startsWith("Let");
System.out.println("b1 = " + b1); // false
b1 = str1.startsWith(" ");
System.out.println("b1 = " + b1); // true
// 從下標(biāo)5開(kāi)始是否以"Let"開(kāi)頭
b1 = str1.startsWith("Let", 5);
System.out.println("b1 = " + b1); // true
b1 = str1.endsWith("See");
System.out.println("b1 = " + b1); // false
b1 = str1.endsWith("See!");
System.out.println("b1 = " + b1); // true
}
}
方法聲明 |
功能介紹 |
boolean equals(Object anObject) |
用于比較字符串內(nèi)容是否相等并返回 |
int hashCode() |
獲取調(diào)用對(duì)象的哈希碼值 |
boolean equalsIgnoreCase(StringanotherString) |
用于比較字符串內(nèi)容是否相等并返回链方,不考慮大小寫(xiě)持痰,如:'A'和'a'是相等 |
- 案例題目
- 提示用戶從鍵盤(pán)輸入用戶名和密碼信息,若輸入”admin”和”123456”則提示“登錄成功祟蚀,歡迎使用”工窍,否則提示“用戶名或密碼錯(cuò)誤,您還有n次機(jī)會(huì)”前酿,若用戶輸入三次后依然錯(cuò)誤則提示“賬戶已凍結(jié)患雏,請(qǐng)聯(lián)系客服人員!”
package com.lagou.task12;
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.提示用戶從鍵盤(pán)輸入用戶名和密碼信息并使用變量記錄
System.out.println("請(qǐng)輸入您的用戶名和密碼信息:");
String userName = sc.next();
String password = sc.next();
// 2.判斷用戶名和密碼是否為 "admin" 和 "123456" 并給出提示
// if ("admin".equals(userName) && "123456".equals(password)) {
if ("admin".equalsIgnoreCase(userName) && "123456".equals(password)) {
System.out.println("登錄成功罢维,歡迎使用淹仑!");
break;
}
if (1 == i) {
System.out.println("賬戶已凍結(jié),請(qǐng)聯(lián)系客服人員肺孵!");
} else {
System.out.println("用戶名或密碼錯(cuò)誤匀借,您還有" + (i - 1) + "次機(jī)會(huì)!");
}
}
// 關(guān)閉掃描器
sc.close();
}
}
方法聲明 |
功能介紹 |
int indexOf(int ch) |
用于返回當(dāng)前字符串中參數(shù)ch指定的字符第一次出現(xiàn)的下標(biāo) |
int indexOf(int ch, int fromIndex) |
用于從fromIndex位置開(kāi)始查找ch指定的字符 |
int indexOf(String str) |
在字符串中檢索str返回其第一次出現(xiàn)的位置平窘,若找不到返回-1 |
int indexOf(String str, intfromIndex) |
表示從字符串的fromIndex位置開(kāi)始檢索str第一次出現(xiàn)的置 |
int lastIndexOf(int ch) |
用于返回參數(shù)ch指定的字符最后一次出現(xiàn)的下標(biāo) |
int lastIndexOf(int ch, intfromIndex) |
用于從fromIndex位置開(kāi)始查找ch指定字符出現(xiàn)的下標(biāo) |
int lastIndexOf(String str) |
返回str指定字符串最后一次出現(xiàn)的下標(biāo) |
int lastIndexOf(String str, intfromIndex) |
用于從fromIndex位置開(kāi)始反向搜索的第一次出現(xiàn)的下標(biāo)吓肋。 |
package com.lagou.task12;
public class StringIndexTest {
public static void main(String[] args) {
// 1.構(gòu)造string類型的對(duì)象并打印
String str1 = new String("Good Good Study, Day Day Up!");
System.out.println("str1 = " + str1); // Good Good Study, Day Day Up!
// 2.實(shí)現(xiàn)字符串中指定字符串和字符串的查找功能
int pos = str1.indexOf('g');
System.out.println("pos = " + pos); // -1 代表查找失敗
pos = str1.indexOf("G");
System.out.println("pos = " + pos); // 0 該字符第一次出現(xiàn)的索引位置
// 表示從下表0開(kāi)始查找字符 'G' 第一次出現(xiàn)的索引位置,包含0
pos = str1.indexOf('G', 0);
System.out.println("pos = " + pos); // 0 該字符第一次出現(xiàn)的索引位置
pos = str1.indexOf('G', 1);
System.out.println("pos = " + pos); // 5 該字符第一次出現(xiàn)的索引位置
System.out.println("---------------------------------------------------");
// 查找字符串
pos = str1.indexOf("day");
System.out.println("pos = " + pos); // -1
pos = str1.indexOf("Day");
System.out.println("pos = " + pos); // 17 字符串第一個(gè)字符的下標(biāo)
pos = str1.indexOf("Day", 17);
System.out.println("pos = " + pos); // 17 字符串第一個(gè)字符的下標(biāo)
pos = str1.indexOf("Day", 18);
System.out.println("pos = " + pos); // 21 字符串第一個(gè)字符的下標(biāo)
System.out.println("---------------------------------------------------");
// 實(shí)現(xiàn)字符和字符串的內(nèi)容的反向查找
pos = str1.lastIndexOf('G');
System.out.println("pos = " + pos); // 5 該字符最后一次出現(xiàn)的索引位置
// 從下標(biāo)5的位置開(kāi)始反向查找
pos = str1.lastIndexOf('G', 5);
System.out.println("pos = " + pos); // 5 該字符最后一次出現(xiàn)的索引位置
pos = str1.lastIndexOf('G', 6);
System.out.println("pos = " + pos); // 5 該字符最后一次出現(xiàn)的索引位置
pos = str1.lastIndexOf('G', 4);
System.out.println("pos = " + pos); // 0 該字符最后一次出現(xiàn)的索引位置
System.out.println("---------------------------------------------------");
pos = str1.lastIndexOf("Day");
System.out.println("pos = " + pos); // 21
pos = str1.lastIndexOf("Day", 21);
System.out.println("pos = " + pos); // 21
pos = str1.lastIndexOf("Day", 20);
System.out.println("pos = " + pos); // 21
pos = str1.lastIndexOf("Day", 15);
System.out.println("pos = " + pos); // -1
}
}
- 案例題目
- 編寫(xiě)通用的代碼可以查詢字符串"Good Good Study, Day Day Up!"中所有"Day"出現(xiàn)的索引位置并打印出來(lái)瑰艘。
package com.lagou.task12;
public class StringIndexTest {
public static void main(String[] args) {
// 1.構(gòu)造string類型的對(duì)象并打印
String str1 = new String("Good Good Study, Day Day Up!");
System.out.println("str1 = " + str1); // Good Good Study, Day Day Up!
// 編寫(xiě)通用代碼實(shí)現(xiàn)將字符串str1中所有 "Day" 出現(xiàn)的索引位置找到并打印出來(lái)
pos = str1.indexOf("Day");
while (-1 != pos) {
System.out.println("pos = " + pos); // 17 21
pos = str1.indexOf("Day", pos + 1);
}
System.out.println("---------------------------------------------------");
// 優(yōu)化一下
pos = 0;
while ((pos = str1.indexOf("Day", pos)) != -1) {
System.out.println("pos = " + pos); // 17 21
pos += "Day".length();
}
}
}
方法聲明 |
功能介紹 |
String substring(intbeginIndex, int endIndex) |
返回字符串中從下標(biāo)beginIndex(包括)開(kāi)始到endIndex(不包括)結(jié)束的子字符串 |
String substring(intbeginIndex) |
返回字符串中從下標(biāo)beginIndex(包括)開(kāi)始到字符串結(jié)尾的子字符串 |
- 案例題目
- 提示用戶從鍵盤(pán)輸入一個(gè)字符串和一個(gè)字符是鬼,輸出該字符(不含)后面的所有子字符串。
package com.lagou.task12;
import java.util.Scanner;
public class SubStringTest {
public static void main(String[] args) {
// 1.構(gòu)造String類型的對(duì)象并打印
String str1 = new String("Happy Wife, Happy Life!");
System.out.println("str1 = " + str1); // Happy Wife, Happy Life!
// 2.獲取字符串中的一部分內(nèi)容并打印
// 表示從房錢字符串中下標(biāo)12開(kāi)始獲取子字符串
String str2 = str1.substring(12);
System.out.println("str2 = " + str2); // Happy Life!
// 可以去到6但是取不到10
String str3 = str1.substring(6, 10);
System.out.println("str3 = " + str3); // Wife
System.out.println("----------------------------------------");
// 獲取輸入字符串中從輸入字符起的子字符串內(nèi)容
System.out.println("請(qǐng)輸入一個(gè)字符串:");
Scanner sc = new Scanner(System.in);
String str4 = sc.next();
System.out.println("請(qǐng)輸入一個(gè)字符:");
String str5 = sc.next();
// 從str4中查找str5第一次出現(xiàn)的索引位置
int pos = str4.indexOf(str5);
System.out.println("pos = " + pos);
// 根據(jù)該位置獲取子字符串
String str6 = str4.substring(pos + 1);
System.out.println("獲取到的子字符串是:" + str6);
}
}
正則表達(dá)式的概念(了解)
- 正則表達(dá)式本質(zhì)就是一個(gè)“規(guī)則字符串”紫新,可以用于對(duì)字符串?dāng)?shù)據(jù)的格式進(jìn)行驗(yàn)證均蜜,以及匹配、查
找芒率、替換等操作囤耳。該字符串通常使用^運(yùn)算符作為開(kāi)頭標(biāo)志,使用$運(yùn)算符作為結(jié)尾標(biāo)志,當(dāng)然也可以省
略紫皇。
正則表達(dá)式的規(guī)則(了解)
正則表達(dá)式 |
說(shuō)明 |
[abc] |
可以出現(xiàn)a慰安、b、c中任意一個(gè)字符 |
[^abc] |
可以出現(xiàn)任何字符聪铺,除了a化焕、b、c的任意字符 |
[a-z] |
可以出現(xiàn)a铃剔、b撒桨、c、……键兜、z中的任意一個(gè)字符 |
[a-zA-Z0-9] |
可以出現(xiàn)az凤类、AZ、0~9中任意一個(gè)字符 |
正則表達(dá)式 |
說(shuō)明 |
. |
任意一個(gè)字符(通常不包含換行符) |
\d |
任意一個(gè)數(shù)字字符普气,相當(dāng)于[0-9] |
\D |
任意一個(gè)非數(shù)字字符 |
\s |
空白字符谜疤,相當(dāng)于[\t\n\x0B\f\r] |
\S |
非空白字符 |
\w |
任意一個(gè)單詞字符,相當(dāng)于[a-zA-Z_0-9] |
\W |
任意一個(gè)非單詞字符 |
正則表達(dá)式 |
說(shuō)明 |
X? |
表示X可以出現(xiàn)一次或一次也沒(méi)有现诀,也就是0 ~ 1次 |
X* |
表示X可以出現(xiàn)零次或多次夷磕,也就是0 ~ n次 |
X+ |
表示X可以出現(xiàn)一次或多次,也就是1 ~ n次 |
X{n} |
表示X可以出現(xiàn)恰好 n 次 |
X{n仔沿,} |
表示X可以出現(xiàn)至少 n 次坐桩,也就是>=n次 |
X{n,m} |
表示X可以出現(xiàn)至少 n 次封锉,但是不超過(guò) m 次绵跷,也就是>=n并且<=m次 |
正則表達(dá)式相關(guān)的方法(熟悉)
方法名稱 |
方法說(shuō)明 |
boolean matches(Stringregex) |
判斷當(dāng)前正在調(diào)用的字符串是否匹配參數(shù)指定的正則表達(dá)式規(guī)則 |
- 案例題目
- 使用正則表達(dá)式描述一下銀行卡密碼的規(guī)則:要求是由6位數(shù)字組成。
- 使用正則表達(dá)式描述一下QQ號(hào)碼的規(guī)則:要求是由非0開(kāi)頭的5~15位數(shù)組成成福。
- 使用正則表達(dá)式描述一下手機(jī)號(hào)碼的規(guī)則:要求是由1開(kāi)頭碾局,第二位數(shù)是3、4闷叉、5擦俐、7、8中的一位握侧,總共11位
- 描述身份證號(hào)碼的規(guī)則:總共18位,6位數(shù)字代表地區(qū)嘿期,4位數(shù)字代表年品擎,2位數(shù)字代表月,2位數(shù)字代表日期备徐, 3位數(shù)字代表個(gè)人萄传,最后一位可能數(shù)字也可能是X。
package com.lagou.task12;
import java.util.Scanner;
public class StringRegTest {
public static void main(String[] args) {
// 1.定義描述規(guī)則的正則表達(dá)式字符串
// 描述銀行卡密碼的規(guī)則:由6位數(shù)字組成
// String reg = "^[0-9]{6}$";
// String reg = "[0-9]{6}";
// String reg = "\\d{6}";
// - 使用正則表達(dá)式描述一下QQ號(hào)碼的規(guī)則:要求是由非0開(kāi)頭的5~15位數(shù)組成。
// String reg = "[1-9]\\d{4,14}";
//- 使用正則表達(dá)式描述一下手機(jī)號(hào)碼的規(guī)則:要求是由1開(kāi)頭秀菱,第二位數(shù)是3振诬、4、5衍菱、7赶么、8中的一位,總共11位
// String reg = "1[34578]\\d{9}";
//- 描述身份證號(hào)碼的規(guī)則:總共18位脊串,6位數(shù)字代表地區(qū)辫呻,4位數(shù)字代表年,2位數(shù)字代表月琼锋,2位數(shù)字代表日期放闺, 3位數(shù)字代表個(gè)人,最后一位可能數(shù)字也可能是X缕坎。
String reg = "(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9|x])";
// 2.提示用戶從鍵盤(pán)輸入指定的內(nèi)容并使用變量記錄
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("請(qǐng)輸入您的銀行卡密碼:");
String str = sc.next();
// 3.判斷用戶輸入的字符串內(nèi)容是否滿足指定的規(guī)則并打印
if (str.matches(reg)) {
System.out.println("銀行卡密碼的格式正確怖侦!");
break;
} else {
System.out.println("銀行卡密碼的格式錯(cuò)誤!");
}
}
}
}
方法名稱 |
方法說(shuō)明 |
String[] split(String regex) |
參數(shù)regex為正則表達(dá)式谜叹,以regex所表示的字符串為分隔符础钠,將字符串拆分成字符串?dāng)?shù)組 |
String replace(char oldChar, charnewChar) |
使用參數(shù)newChar替換此字符串中出現(xiàn)的所有參數(shù)oldChar |
String replaceFirst(String regex,String replacement) |
替換此字符串匹配給定的正則表達(dá)式的第一個(gè)子字符串 |
String replaceAll(String regex,String replacement) |
將字符串中匹配正則表達(dá)式regex的字符串替換成replacement |
package com.lagou.task12;
public class StringRegMethodTest {
public static void main(String[] args) {
// 1.準(zhǔn)備一個(gè)字符串對(duì)象
String str1 = "1001,zhangfei,30";
System.out.println("str1 = " + str1); // 1001,zhangfei,30
// 2.按照逗號(hào)對(duì)字符串內(nèi)容進(jìn)行切割
String[] sArr = str1.split(",");
for (int i = 0; i < sArr.length; i++) {
// 下標(biāo)為0的字符串是1001 下標(biāo)為1的字符串是zhangfei 下標(biāo)為2的字符串是30
System.out.println("下標(biāo)為" + i + "的字符串是:" + sArr[i]);
}
System.out.println("-------------------------------------------------------");
// 3.準(zhǔn)備一個(gè)字符串內(nèi)容并進(jìn)行替換
String str2 = "我的小名叫大帥哥";
// 將字符串中所有的字符 '我' 替換為 '你'
String str3 = str2.replace('我', '你');
System.out.println("str2 = " + str2); //我的小名叫大帥哥
System.out.println("str3 = " + str3); //你的小名叫大帥哥
// 將字符串中所有的字符 '大' 替換為 '小'
String str4 = str3.replace('大', '小');
System.out.println("str4 = " + str4); // 你的小名叫小帥哥
// 將字符串中所有的字符 '小' 替換為 '大'
String str5 = str4.replace('小', '大');
System.out.println("str5 = " + str5); // 你的大名叫大帥哥
System.out.println("-------------------------------------------------------");
// 4.準(zhǔn)備一個(gè)字符串進(jìn)行字符串內(nèi)容的替換
String str6 = "123abc456def789ghi";
// 將第一個(gè)數(shù)字字符串替換為'#'
String str7 = str6.replaceFirst("\\d+", "#");
System.out.println("替換第一個(gè)字符串后的結(jié)果是:" + str7); // #abc456def789ghi
// 將所有字母的字符串替換為 "ABC"
String str8 = str7.replaceAll("[a-z]+", "ABC");
System.out.println("str8 = " + str8);// #ABC456ABC789ABC
}
}