String類和正則表達(dá)式
今天的主要內(nèi)容
-
Scanner類概述
- Scanner獲取數(shù)據(jù)出現(xiàn)的小問題及解決方案
-
String類概述
String類的構(gòu)造方法
String面試題之"=="和equals的區(qū)別
Sring類的判斷功能
String類的獲取功能
字符串的遍歷
統(tǒng)計(jì)不同類型字符個(gè)數(shù)
String類的轉(zhuǎn)換功能
把一個(gè)字符串的首字母轉(zhuǎn)成大寫,其余為小寫。(只考慮英文大小寫字母字符)
字符串反轉(zhuǎn)
在大串中查找小串出現(xiàn)的次數(shù)思路
正則表達(dá)式
一、Scanner的概述和方法介紹(掌握)
A:Scanner的概述
-
B:Scanner的構(gòu)造方法原理
- Scanner(InputStream source)
- System類下有一個(gè)靜態(tài)的字段:
- public static final InputStream in; 標(biāo)準(zhǔn)的輸入流,對(duì)應(yīng)著鍵盤錄入。
-
C:一般方法
- hasNextXxx() 判斷是否還有下一個(gè)輸入項(xiàng),其中Xxx可以是Int,Double等。如果需要判斷是否包含下一個(gè)字符串,則可以省略Xxx
- nextXxx() 獲取下一個(gè)輸入項(xiàng)。Xxx的含義和上個(gè)方法中的Xxx相同,默認(rèn)情況下,Scanner使用空格,回車等作為分隔符
二、常見對(duì)象(Scanner獲取數(shù)據(jù)出現(xiàn)的小問題及解決方案)(掌握)
-
A:兩個(gè)常用的方法:
public int nextInt():獲取一個(gè)int類型的值
public String nextLine():獲取一個(gè)String類型的值
-
B:案例演示
-
b:再演示先獲取int值,然后獲取String值出現(xiàn)問題
- 當(dāng)nextInt()與nextLine()一起使用時(shí),可能會(huì)出現(xiàn)問題
nextInt()方法是鍵盤錄入整數(shù)的方法,當(dāng)我們錄入10的時(shí),其實(shí)是在鍵盤錄入了10和\r\n,nextInt()方法只獲取10就結(jié)束了
nextLine()是鍵盤錄入字符串的方法,遇到\r\n時(shí)證明一行結(jié)束
因此此時(shí)產(chǎn)生沖突
- 當(dāng)nextInt()與nextLine()一起使用時(shí),可能會(huì)出現(xiàn)問題
-
c:問題解決方案
第一種:先獲取一個(gè)數(shù)值后,在創(chuàng)建一個(gè)新的鍵盤錄入對(duì)象獲取字符串。
第二種:把所有的數(shù)據(jù)都先按照字符串獲取,然后要什么,你就對(duì)應(yīng)的轉(zhuǎn)換為什么。(后面講)
-
三、常見對(duì)象(String類的概述)(掌握)
-
A:String類的概述
通過JDK提供的API,查看String類的說明
-
可以看到這樣的兩句話。
a:字符串字面值"abc"也可以看成是一個(gè)字符串對(duì)象。
b:字符串是常量,一旦被賦值,就不能被改變。
四、常見對(duì)象(String類的構(gòu)造方法)(掌握)
-
A:常見構(gòu)造方法
public String():空構(gòu)造
public String(byte[] bytes):把字節(jié)數(shù)組轉(zhuǎn)成字符串
public String(byte[] bytes,int index,int length):把字節(jié)數(shù)組的一部分轉(zhuǎn)成字符串
public String(char[] value):把字符數(shù)組轉(zhuǎn)成字符串
public String(char[] value,int index,int count):把字符數(shù)組的一部分轉(zhuǎn)成字符串
public String(String original):把字符串常量值轉(zhuǎn)成字符串
-
B:案例演示
- 演示String類的常見構(gòu)造方法
五、常見對(duì)象(String類的常見面試題)(掌握)
-
==可以比較基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
- 當(dāng)比較基本數(shù)據(jù)類行時(shí),比較的是值
- 當(dāng)比較引用時(shí),比較的是地址
- String屬于引用類型
String重寫了equals方法,因此比較的是值
-
1.判斷定義為String類型的s1和s2是否相等*****
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2)); //true
- image
-
2.下面這句話在內(nèi)存中創(chuàng)建了幾個(gè)對(duì)象?*****
String s1 = new String("abc"); //兩個(gè)對(duì)象
創(chuàng)建兩個(gè)對(duì)象,一個(gè)在常量池中,一個(gè)在堆中
- image
-
3.判斷定義為String類型的s1和s2是否相等
String s1 = new String("abc");
String s2 = "abc";
-
System.out.println(s1 == s2); //false
- s1指向的是堆中的字符串
- s2指向的是常量池中的字符串
System.out.println(s1.equals(s2)); //true
-
4.判斷定義為String類型的s1和s2是否相等
String s1 = "a" + "b" + "c";
String s2 = "abc";
-
System.out.println(s1 == s2); //true
- 在編譯時(shí),java中有常量?jī)?yōu)化機(jī)制
System.out.println(s1.equals(s2)); //true
-
5.判斷定義為String類型的s1和s2是否相等
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); //false
System.out.println(s3.equals(s2)); //true
- image
六、常見對(duì)象(String類的判斷功能)(掌握)
-
A:String類的判斷功能
boolean equals(Object obj):比較字符串的內(nèi)容是否相同,區(qū)分大小寫
boolean equalsIgnoreCase(String str):比較字符串的內(nèi)容是否相同,忽略大小寫
boolean contains(String str):判斷大字符串中是否包含小字符串
boolean startsWith(String str):判斷字符串是否以某個(gè)指定的字符串開頭
boolean endsWith(String str):判斷字符串是否以某個(gè)指定的字符串結(jié)尾
boolean isEmpty():判斷字符串是否為空。
若字符串常量和字符串變量進(jìn)行比較,通常都是字符串常量調(diào)用方法,防止空指針異常
七、常見對(duì)象(String類的獲取功能)(掌握)
-
A:String類的獲取功能
int length():獲取字符串的長(zhǎng)度。
char charAt(int index):獲取指定索引位置的字符
int indexOf(int ch):返回指定字符在此字符串中第一次出現(xiàn)處的索引。
int indexOf(String str):返回指定字符串在此字符串中第一次出現(xiàn)處的索引。
int indexOf(int ch,int fromIndex):返回指定字符在此字符串中從指定位置后第一次出現(xiàn)處的索引。
int indexOf(String str,int fromIndex):返回指定字符串在此字符串中從指定位置后第一次出現(xiàn)處的索引。
lastIndexOf
-
String substring(int start):從指定位置開始截取字符串,默認(rèn)到末尾。
- subString方法會(huì)返回新的字符串,不會(huì)改變?cè)醋址欢ㄒ⒁?/li>
String substring(int start,int end):從指定位置開始到指定位置結(jié)束截取字符串。
八、常見對(duì)象(字符串的遍歷)(掌握)
- A:案例演示
- 需求:遍歷字符串
- 分析:
- 循壞獲取每一個(gè)字符
- 用到charAt(int index)方法
九、常見對(duì)象(統(tǒng)計(jì)不同類型字符個(gè)數(shù))(掌握)
-
A:案例演示
需求:統(tǒng)計(jì)一個(gè)字符串中大寫字母字符,小寫字母字符,數(shù)字字符出現(xiàn)的次數(shù),其他字符出現(xiàn)的次數(shù)。
ABCDEabcd123456!@#$%^
-
分析:
-
for循壞遍歷字符串中的每一個(gè)字符,charAt()方法
-
for循壞中對(duì)每一個(gè)字符進(jìn)行判斷
大寫字母:ch >= 'A' && ch <= 'Z'
小寫字母:ch >= 'a' && ch <= 'z'
數(shù)字字符:ch >= '0' && ch <= '9'
其他字符
-
其中需要定義常量,統(tǒng)計(jì)個(gè)數(shù)
-
-
程序:
public static void main(String[] args) { //定義常量 int upperCount = 0; int lowerCount = 0; int numCount = 0; int elseCount = 0; //定義字符串 String string = "ABCDEabcd123456!@#$%^"; //1. for循壞遍歷字符串中的每一個(gè)字符,charAt()方法 for(int i = 0;i < string.length();i++) { char ch = string.charAt(i); //2. for循壞中對(duì)每一個(gè)字符進(jìn)行判斷 if(ch >= 'A' && ch <= 'Z') upperCount++; else if(ch >= 'a' && ch <= 'z') lowerCount++; else if(ch >= '0' && ch <= '9') numCount++; else elseCount++; } System.out.println("大寫字母?jìng)€(gè)數(shù):" + upperCount + "\n小寫字母?jìng)€(gè)數(shù):" + lowerCount + "\n數(shù)字字符個(gè)數(shù):" + numCount + "\n其他字符個(gè)數(shù):" + elseCount); }
十、常見對(duì)象(String類的轉(zhuǎn)換功能)(掌握)
-
A:String的轉(zhuǎn)換功能:
byte[] getBytes():把字符串轉(zhuǎn)換為字節(jié)數(shù)組。
char[] toCharArray():把字符串轉(zhuǎn)換為字符數(shù)組。
static String valueOf(char[] chs):把字符數(shù)組轉(zhuǎn)成字符串。
-
static String valueOf(int i):把int類型的數(shù)據(jù)轉(zhuǎn)成字符串。
- 注意:String類的valueOf方法可以把任意類型的數(shù)據(jù)轉(zhuǎn)成字符串
* String toLowerCase():把字符串轉(zhuǎn)成小寫。(了解)
* String toUpperCase():把字符串轉(zhuǎn)成大寫。
* String concat(String str):把字符串拼接。
十一、常見對(duì)象(按要求轉(zhuǎn)換字符)(鏈?zhǔn)骄幊陶莆?
-
A:案例演示
需求:把一個(gè)字符串的首字母轉(zhuǎn)成大寫,其余為小寫。(只考慮英文大小寫字母字符)
-
程序:
public static void main(String[] args) { String string = "hahaWOhaoxiangJIA"; String string2 = string.substring(0,1).toUpperCase().concat(string.substring(1).toLowerCase()); System.out.println(string2); //Hahawohaoxiangjia } 鏈?zhǔn)骄幊蹋好恳淮握{(diào)用方法后返回的是一個(gè)對(duì)象,可以繼續(xù)調(diào)用其他方法
十二、常見對(duì)象(把數(shù)組轉(zhuǎn)成字符串)
-
A:案例演示
-
需求:把數(shù)組中的數(shù)據(jù)按照指定的格式拼接成一個(gè)字符串
-
舉例:
- int[] arr = {1,2,3};
-
輸出結(jié)果:
- "[1, 2, 3]"
分析:其實(shí)是字符串的一個(gè)拼接工作
-
程序:
public static void main(String[] args) { int[] arr = {1,2,3}; String string = "["; for(int i = 0;i < arr.length;i++) { int ch = arr[i]; if(i == arr.length-1) { string = string.concat(ch + "]"); }else string = string.concat(ch + ", "); } System.out.println(string); }
-
-
十三、常見對(duì)象(String類的其他功能)
-
A:String的替換功能及案例演示
String replace(char old,char new)
String replace(String old,String new)
-
B:String的去除字符串兩空格及案例演示
- String trim()
-
C:String的按字典順序比較兩個(gè)字符串及案例演示
int compareTo(String str)(暫時(shí)不用掌握)
int compareToIgnoreCase(String str)(了解)
十四、常見對(duì)象(字符串反轉(zhuǎn))
-
A:案例演示
-
需求:把字符串反轉(zhuǎn)
舉例:鍵盤錄入"abc"
輸出結(jié)果:"cba"
-
分析:
鍵盤錄入字符串
轉(zhuǎn)換為字符數(shù)組
-
將數(shù)組反轉(zhuǎn)
- 聯(lián)系快速排序
將數(shù)組轉(zhuǎn)為字符串(new String(byte[] b))
-
程序:
public static void main(String[] args) { //1. 鍵盤錄入字符串 Scanner input = new Scanner(System.in); System.out.println("請(qǐng)輸入一個(gè)字符串:"); String string = input.nextLine(); //2. 轉(zhuǎn)換為字符數(shù)組 char[] cArr = string.toCharArray(); //3. 將數(shù)組反轉(zhuǎn) int i; int j; for(i = 0,j = cArr.length - 1;i < j;i++,j--) { //交換cArr[i]和cArr[j] char temp = cArr[i]; cArr[i] = cArr[j]; cArr[j] = temp; } //4. 將數(shù)組轉(zhuǎn)為字符串(new String(byte[] b)) System.out.println("反轉(zhuǎn)后字符串為:"); System.out.println(new String(cArr)); }
-
十五、常見對(duì)象(在大串中查找小串出現(xiàn)的次數(shù)思路圖解)
-
A:畫圖演示
需求:統(tǒng)計(jì)大串中小串出現(xiàn)的次數(shù)
這里的大串和小串可以自己根據(jù)情況給出
-
程序:
//定義大串 String max = "hahahahawoxianghuijiaxixixixiwoxianghuijiawojia"; //定義小串 String min = "woxianghuijia"; //定義計(jì)數(shù)器變量 int count = 0; //定義索引 int index = 0; //定義循壞 while((index = max.indexOf(min)) != -1){ count++; max = max.subString(index + min.length()); } System.out.println(count);
正則表達(dá)式
一、正則表達(dá)式概述
-
A:正則表達(dá)式
是指一個(gè)用來描述或者匹配一系列符合某個(gè)語法規(guī)則的字符串的單個(gè)字符串。其實(shí)就是一種規(guī)則。有自己特殊的應(yīng)用。
作用:比如注冊(cè)郵箱,郵箱有用戶名和密碼,一般會(huì)對(duì)其限制長(zhǎng)度,這個(gè)限制長(zhǎng)度的事情就是正則表達(dá)式做的
-
B:案例演示
-
需求:校驗(yàn)qq號(hào)碼.
- 1:要求必須是5-15位數(shù)字
- 2:0不能開頭
- 3:必須都是數(shù)字
-
a:非正則表達(dá)式實(shí)現(xiàn)
public static void main(String[] args) { System.out.println(checkQQ("123456")); } public static boolean checkQQ(String qq) { boolean flag = true; //若校驗(yàn)不合格則置為false if(qq.length() >= 5 && qq.length() <= 15) { if(!qq.startsWith("0")) { char[] cArr = qq.toCharArray(); for (int i = 0; i < cArr.length; i++) { char ch = cArr[i]; if(!(ch >= '0' && ch <= '9')) { flag = false; break; } } }else { //以0開頭 flag = false; } }else { //不是5-15位數(shù)字 flag = false; } return flag; } -
b:正則表達(dá)式實(shí)現(xiàn)
String regex = "[1-9]\\d{4,14}"; System.out.println("123256".matches(regex));
-
二、常見對(duì)象(字符類演示)
- A:字符類
[ ] 代表單個(gè)字符
[abc] a、b 或 c(簡(jiǎn)單類)
-
[^abc] 任何字符,除了 a、b 或 c(否定)
- ^表否定
[a-zA-Z] a到 z 或 A到 Z,兩頭的字母包括在內(nèi)(范圍)
[a-d[m-p]] a到d或者m到p
-
[a-z&&[def]] &&交集,因此此時(shí)指的是:d或e或f
- 等價(jià)于[def]
[a-z&&[^bc]] a到z之間而且不是b和c
[a-z&&[^m-p]] a到z之間而且不是m到p
[0-9] 0到9的字符都包括
三、常見對(duì)象(預(yù)定義字符類演示)
-
A:預(yù)定義字符類
. 任何單個(gè)字符。
-
\d 三個(gè)數(shù)字字符:[0-9]
- \d轉(zhuǎn)義字符
\D [^0-9] 除0-9的單個(gè)字符
\w 單詞字符:[a-zA-Z_0-9]
\s 空白字符: [ \t\n\x0B\f\r]
\S 非空白字符: [^\s]
\w 一個(gè)單詞字符: [a-zA-Z_0-9]
\W 非單詞字符: [^\w]
四、常見對(duì)象(數(shù)量詞)
-
A:Greedy 數(shù)量詞
-
X? X,一次或一次也沒有
[abc]?
a或者b或者c出現(xiàn)一次或者一次也沒有
-
X* X,零次或多次
[abc]*
a或者b或者c出現(xiàn)0次或者多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超過 m 次
-
五、常見對(duì)象(正則表達(dá)式的分割功能)
-
A:正則表達(dá)式的分割功能
String類的功能:public String[] split(String regex)
當(dāng)以'.'切割時(shí),正則表達(dá)為:regex = "\.",需要兩個(gè)\
-
B:案例演示
- 正則表達(dá)式的分割功能
六、常見對(duì)象(把給定字符串中的數(shù)字排序)
-
A:案例演示
需求:我有如下一個(gè)字符串:”91 27 46 38 50”,請(qǐng)寫代碼實(shí)現(xiàn)最終輸出結(jié)果是:”27 38 46 50 91”
-
分析:
- 按照空格分割
- 調(diào)用排序函數(shù)
- 遍歷數(shù)組輸出結(jié)果
-
程序
public static void main(String[] args) { //1. 按照空格分割 String string = "91 27 46 38 50"; String[] sArr = string.split(" "); //2. 調(diào)用排序函數(shù) Arrays.sort(sArr); //3. 遍歷數(shù)組輸出結(jié)果 for(String string2 : sArr) { System.out.print(string2 + " "); } }
七、常見對(duì)象(正則表達(dá)式的替換功能)
-
A:正則表達(dá)式的替換功能
- String類的功能:public String replaceAll(String
regex,String replacement)
- String類的功能:public String replaceAll(String
-
B:案例演示
- 正則表達(dá)式的替換功能
C:代碼實(shí)現(xiàn)
public static void main(String[] args) {
String string = "hahaha23hahah19";
String regex = "[0-9]"; //此時(shí)使用\\d也可以
System.out.println(string.replaceAll(regex, "")); //輸出hahahahahah
}
八、常見對(duì)象(正則表達(dá)式的分組功能)
-
A:正則表達(dá)式的分組功能
- 捕獲組可以通過從左到右計(jì)算其開括號(hào)來編號(hào)。例如,在表達(dá)式 ((A)(B(C))) 中,存在四個(gè)這樣的組:
1 ((A)(B(C))) 2 (A 3 (B(C)) 4 (C) 組零始終代表整個(gè)表達(dá)式。-
B:案例演示
-
a:切割
- 需求:請(qǐng)按照疊詞切割: "sdqqfgkkkhjppppkl";
-
b:替換
需求:我我....我...我.要...要要...要學(xué)....學(xué)學(xué)..學(xué).編..編編.編.程.程.程..程
將字符串還原成:“我要學(xué)編程”。
-
-
C:知識(shí)儲(chǔ)備
-
判斷是否為疊詞
String regex = "(.)\\1(.)\\2"; //此時(shí)\\1代表第一組出現(xiàn)一次,\\2代表第二組出現(xiàn)一次 System.out.println("開開心心".matches(regex)); //true System.out.println("aabb".matches(regex)); //true System.out.println("abb".matches(regex)); //false 需求:請(qǐng)按照疊詞切割: "sdqqfgkkkhjppppkl";
-
程序:
String string = "sdqqfgkkkhjppppkl"; String regex = "(.)\\1+"; //第一組出現(xiàn)一次或多次 String[] sArr = string.split(regex); for(String string2 : sArr) { System.out.print(string2); //輸出結(jié)果為:sdfghjkl } 需求:我我....我...我.要...要要...要學(xué)....學(xué)學(xué)..學(xué).編..編編.編.程.程.程..程,將字符串還原成:“我要學(xué)編程”。
-
程序:
String string = "我我....我...我.要...要要...要學(xué)....學(xué)學(xué)..學(xué).編..編編.編.程.程.程..程"; //先把'.'去掉 String regex = "\\.+"; String string2 = string.replaceAll(regex,""); //輸出:我我我我要要要要學(xué)學(xué)學(xué)學(xué)編編編編程程程程 //再把疊詞去掉 String regex2 = "(.)\\1+"; System.out.print(string2.replaceAll(regex2,"$1")); //$1獲得第一組數(shù)據(jù)并替換掉regex表達(dá)的內(nèi)容
-
九、常見對(duì)象(Pattern和Matcher的概述)
A:Pattern和Matcher的概述
-
B:模式和匹配器的典型調(diào)用順序
通過JDK提供的API,查看Pattern類的說明
-
典型的調(diào)用順序是
-
Pattern p = Pattern.compile("a*b");
- 獲取到正則表達(dá)式
-
Matcher m = p.matcher("aaaaab");
- 獲取匹配器
-
boolean b = m.matches()
- 判斷是否可匹配
-
上述等價(jià)于
- System.out.println("aaaaab".matches("a*b"));
-
十、常見對(duì)象(正則表達(dá)式的獲取功能)
-
A:正則表達(dá)式的獲取功能
- Pattern和Matcher的結(jié)合使用
-
B:案例演示
- 需求:把一個(gè)字符串中的手機(jī)號(hào)碼獲取出來
-
C:程序
public class TestRegular_5 { public static void main(String[] args) { String string = "我的手機(jī)號(hào)是:13345678910,哈哈哈哈,小明的手機(jī)號(hào)是:18945612300,小花的手機(jī)號(hào)是15975348621"; String regex = "1[3578]\\d{9}"; //手機(jī)號(hào)碼正則表達(dá)式 /*Pattern p = Pattern.compile(regex); Matcher m = p.matcher(string); boolean b = m.matches();*/ Pattern p = Pattern.compile(regex); Matcher m = p.matcher(string); String s1 = null; while(m.find()) { //找到就輸出 s1 = m.group(); System.out.println(s1); } } } /* * 在JDK1.8中輸出結(jié)果為: * ----------------- * 13345678910 18945612300 15975348621 ----------------- * */
十一、常見對(duì)象(String類對(duì)正則表達(dá)式的支持)
public boolean matches(String regex)
public String replaceAll(String regex,String replacement)
public String replaceFirst(String regex,String replacement)
public String[] split(String regex)
public String[] split(String regex,int limit)
* Splits this string around matches of the given regular expression.
十二、常見對(duì)象(正則表達(dá)式在反射中應(yīng)用)
-
定義抽象超類Fruit
abstract class Fruit { abstract void desc(); } -
定義Apple繼承Fruit
public class Apple extends Fruit{ @Override void desc() { // TODO Auto-generated method stub System.out.println("蘋果過好好吃啊"); } } -
定義Durian繼承Fruit
public class Durian extends Fruit{ @Override void desc() { // TODO Auto-generated method stub System.out.println("榴蓮過好好吃啊"); } } -
定義Orange繼承Fruit
public class Orange extends Fruit{ @Override void desc() { // TODO Auto-generated method stub System.out.println("橘子過好好吃啊"); } } -
定義Factory生產(chǎn)水果
public class Factory { public static Fruit getInstance(String fruitName) { Class c1 = null; try { c1 = Class.forName(fruitName); Fruit fruit = (Fruit)c1.newInstance(); return fruit; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } -
定義測(cè)試類
public class TestFactory { public static void main(String[] args) { Fruit fruit = Factory.getInstance("factory.Orange"); fruit.desc(); } }


