12.1 Scanner類
- 一個可以使用正則表達式來解析基本類型和字符串的簡單文本掃描器
- 定義:
public final class Scanner extends Object
12.1.1 Scanner基本鍵盤錄入
Scanner scanner = new Scanner(System.in); //控制臺鍵盤錄入
System.out.println("請輸入一個int數(shù),輸入0退出跃巡!");
while (true) {
if (scanner.hasNextInt()) { //判斷輸入的內(nèi)容,Scanner有很多判斷類型的方法
int number = scanner.nextInt();
if ( 0 == number) break;
System.out.println("輸入的內(nèi)容是: " + number);
}else {
System.err.println("輸入類型不是int素邪。退出程序。");
break;
}
}
scanner.close();
//nextInt()是鍵盤錄入整數(shù)的方法偷线,當(dāng)我們錄入10的時候
//其實鍵盤上錄入的是10和\r\n,nextInt()方法只獲取了10就結(jié)束了
//nextLine()是鍵盤錄入字符串的方法乏奥,可以接收任意類型,通過\r\n來判斷錄入一行是否結(jié)束
解決方法:1邓了,創(chuàng)建2個Scanner對象歇式;2,使用nextLine()接收痕鳍。
12.2 String類
- a: 字符串字面值"abc"也可以看成一個字符串對象
- b: 字符串是常量龙巨,一旦賦值,就不能被改變
使用構(gòu)造方法初始化的例子:
byte[] arr1 = {97,98,99,45};
String s1 = new String(arr1); //通過byte數(shù)組初始化
System.out.println(s1); //輸出 abc-(通過當(dāng)前平臺的字符集碼表旨别,來解碼成字符串的)
byte[] arr2 = s1.getBytes(); //字符串又轉(zhuǎn)為碼表值
System.out.println(arr2[0]+".."+arr2[1]);
char data[] = {'a','c','z','o','5'};
String s2 = new String(data); //字符串成串,就是字符串
System.out.println(s2);
12.2.1 String面試題
// 第一題 (常量池屬于方法區(qū)的一部分)
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //?為什么铭若?因為同樣值的字符串递览,在常量池只有一份,所以地址值也相等
System.out.println(s1.equals(s2)); //肯定是true
// 第二題 下面這句話在內(nèi)存中創(chuàng)建了幾個對象镜雨?
String s3 = new String("abc");
// 答:2個儿捧,常量池一個,然后拷貝副本一個到 堆內(nèi)存一個(因為有new)菲盾,棧區(qū)的s3指向堆內(nèi)存的"abc"
// 第三題
String a1 = new String("abc");
String a2 = "abc";
System.out.println( a1 == a2); //false 一個堆地址,一個常量池地址
System.out.println( a1.equals(a2)); //肯定是true
// 第四題
String q1 = "a" + "b" + "c";
String q2 = "abc";
System.out.println( q1 == q2); //true,Java中有常量優(yōu)化機制瞭空,a-b-c相加,編譯時就優(yōu)化成了abc
System.out.println( q1.equals(q2)); //肯定是true
// 第五題
String z1 = "ab";
String z2 = "abc";
String z3 = z1 + "c"; //這里是 變量 + 常量南捂,跟上面abc相加是不一樣的
System.out.println(z2 == z3); //false 一個在堆內(nèi)存旧找,一個在常量池
System.out.println(z2.equals(z3)); //肯定是true
12.2.2 String常用判斷方法
boolean equals(Object anObject) //比較兩個字符串是否相同,區(qū)分大小寫
boolean equalsIgnoreCase(String anotherString) //比較兩個字符串是否相同鞭缭,忽略大小寫
boolean contains(CharSequence s) //判斷字符串是否包含字符串s
boolean startsWith(String s) //判斷字符串是否以某個字符串s開頭
boolean endsWith(String s) //判斷字符串是否以某個字符串s結(jié)尾
boolean isEmpty() //判斷字符串是否為空(長度為0)
"" 和 null 的區(qū)別
"" 是字符串常量魏颓,同時也是String類對象,可以調(diào)用String類的所有方法
null 是空常量沦童,不能調(diào)用任何方法叹话,否則出現(xiàn)空指針異常,null可以給任何引用數(shù)據(jù)類型賦值驼壶!
12.2.2 String的獲取功能(截取)
int length() //獲取字符串的長度(數(shù)組的長度是屬性,字符串的長度是方法)
char charAt(int index) //獲取字符串指定位置的字符(可能字符串索引越界異常)
int indexOf(char c) //獲取字符c在字符串中出現(xiàn)的第一個位置泵喘,無則返回-1
int indexof(String str) //返回字符串str在字符串出現(xiàn)的第一個位置般妙,無則返回-1
int indexOf(int ch, int fromIndex) //字符在字符串中出現(xiàn)的第一個位置,從fromIndex開始匹配
int indexOf(String ss, int fromIndex) //字符串在字符串中出現(xiàn)的第一個位置股冗,從fromIndex開始匹配
lastIndexOf(xx) //跟indexof相反和蚪,從結(jié)尾開始匹配位置,值還是從正開始的怯疤,無則返回-1
String substring(int beginIndex) //從指定位置截取字符串(包含此位置)催束,默認(rèn)到末尾。
String substring(int beginIndex, int endIndex) //截取字符串,從哪截取到哪塔淤,包含頭,不含尾
12.2.2 String的遍歷
String string = "遍歷字符串";
for (int i = 0; i < string.length(); i++) {
System.out.println(string.charAt(i));
}
12.2.2 題目:統(tǒng)計不同類型字符的個數(shù)
// 需求:統(tǒng)計字符串中大寫字符高蜂,小寫字符,數(shù)字字符稿饰,其他字符出現(xiàn)的次數(shù)
//分析:字符值都是有范圍的露泊,通過范圍來判斷是否包含該字符
String string = "Aabbcc123*&^$-a1@";
int big = 0, small=0, num=0, other=0;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c >= 'A' && c <= 'Z') big++;
else if (c >= 'a' && c <= 'z') small++;
else if (c >= '0' && c <= '9') num++;
else other++;
}
12.2.4 String常用轉(zhuǎn)換方法
byte[] getBytes() //把字符串轉(zhuǎn)為碼表值(中文有時候是GBK碼表)
char[] toCharArray() //把字符串轉(zhuǎn)為char數(shù)組
static String valueOf(char data[]) //把字符數(shù)組,轉(zhuǎn)為字符串
static String valueOf(int i) //把int轉(zhuǎn)為字符串
static String valueOf(double d) //把double轉(zhuǎn)為字符串
//valueOf可以將任意類型的對象侣姆,轉(zhuǎn)為字符串
String toLowerCase() //將字符串轉(zhuǎn)為小寫
String toUpperCase() //將字符串轉(zhuǎn)為大寫
String concat(String str) //字符串拼接脖咐,沒有 + 號拼接強大
12.2.5 題目:轉(zhuǎn)換字符
//需求: 把第一個字符串首字母大寫,其余小寫
String s = "loveXXOO";
String re = s.substring(0, 1).toUpperCase().concat(s.substring(1).toLowerCase());
System.out.println(re); //注意上面的鏈?zhǔn)骄幊坛テ荆捌诳梢苑珠_寫
12.2.5 題目:把數(shù)組轉(zhuǎn)為字符串
int[] arr = {1,3,5,68};
String string = "[";
for (int i = 0; i < arr.length; i++) {
if (i == (arr.length - 1)) //其實根據(jù)運算符號的優(yōu)先級派歌,不加里面的()也是可以的
string = string + arr[i] + "]";
else
string = string + arr[i] + ",";
} // if else 不加{},是為了節(jié)省篇幅胶果,建議加上
System.out.println(string);
12.2.6 String的其他功能
String replace(char old, char new) //替換字符串中的字符,返回新的字符串霎烙。不存在返回原字符串
String replace(String old, String new) //同上
String trim() //去掉字符串兩端的空格蕊连,中間不會去掉
int compareTo(String ss) //比較兩個字符串,按照碼表值比較(Unicode)
int compareToIgnoreCase(String str) //比較2個字符串甘苍,不區(qū)分大小寫
12.2.7 題目:字符串反轉(zhuǎn)
String s = "123456", s2 = "";
for (int i = 0; i < s.length(); i++) {
s2 = s.charAt(i) + s2;
}
System.out.println(s2);
12.2.8 題目:字符串出現(xiàn)的次數(shù)
// 需求:求s2在s中出現(xiàn)的個數(shù)
String s = "qwe12-qwe12-qwe12-qwe12-qwe12-";
String s2 = "12";
int count = 0 ; //出現(xiàn)的次數(shù)
int formIndex = 0; //從什么位置開始匹配
while ( (formIndex = s.indexOf(s2)) != -1 ) {
count++;
s = s.substring(formIndex+s2.length());
}
System.out.println(count);
END载庭。
我是小侯爺廊佩。
在魔都艱苦奮斗靖榕,白天是上班族,晚上是知識服務(wù)工作者序矩。
如果讀完覺得有收獲的話,記得關(guān)注和點贊哦瓶蝴。
非要打賞的話租幕,我也是不會拒絕的。