1_Scanner的概述和方法介紹*
- A:Scanner的概述
-
B:Scanner的構造方法原理
- Scanner(InputStream source)
-
System類下有一個靜態的欄位:
- public static final InputStream in; 標準的輸入流,對應著鍵盤錄入。
-
C:一般方法
- hasNextXxx() 判斷是否還有下一個輸入項,其中Xxx可以是Int,Double等。如果需要判斷是否包含下一個字串,則可以省略Xxx
- nextXxx() 獲取下一個輸入項。Xxx的含義和上個方法中的Xxx相同,預設情況下,Scanner使用空格,回車等作為分隔符
import java.util.Scanner;
public class Scanner_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //鍵盤錄入
System.out.println("請輸入一個整數:");
// int i = sc.nextInt(); //儲存在I中
// System.out.println(i);
if(sc.hasNextInt()) {
int i =sc.nextInt();
System.out.println(sc);
} else {
System.out.println("您輸入的型別有誤");
}
}
}
2_Scanner獲取資料出現的小問題及解決方案*
-
A:兩個常用的方法:
- public int nextInt():獲取一個int型別的值
- public String nextLine():獲取一個String型別的值
-
B:案例演示
- a:先演示獲取多個int值,多個String值的情況
- b:再演示先獲取int值,然後獲取String值出現問題
-
c:問題解決方案
- nextInt接收一個整數:當我輸入10時,回車後:其實在鍵盤上錄入的是10和rn,nextInt()方法獲取10後就結束了
- nextLine()是鍵盤錄入字串的方法,可以接收任意型別,但它憑什麼能獲取一行呢?
- 第一種:先獲取一個數值後,在建立一個新的鍵盤錄入物件獲取字串。
- 第二種:把所有的資料都先按照字串獲取,然後要什麼,你就對應的轉換為什麼。(後面講)
public class Scanner_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/* System.out.println("請輸入一個整數:");
int i1 = sc.nextInt();
System.out.println("請輸入第二個整數:");
int i2 = sc.nextInt();
System.out.println("i1 = " + i1 + ",i2 = " + i2);
*/
/*
System.out.println("請輸入第一個字串");
String line1 = sc.nextLine();
System.out.println("請輸入第二個字串");
String line2 = sc.nextLine();
System.out.println("line1 = " + line1 + ",line2 = " + line2);
*/
System.out.println("請輸入一個整數:");
int i1 = sc.nextInt();
Scanner sc2 = new Scanner(System.in);
System.out.println("請輸入第二個字串");
String line = sc2.nextLine();
System.out.println("i1 = " + i1 + ",line = " + line);
}
}
3_String類的概述*
-
A:String類的概述
- 通過JDK提供的API,檢視String類的說明
-
可以看到這樣的兩句話。
- a:字串字面值”abc”也可以看成是一個字串物件。
- b:字串是常量,一旦被賦值,就不能被改變。
public class string_1 {
public static void main(String[] args) {
//Person p = new Person();
String str= "abc"; //"abc"可以看成是一個字串物件。
str= "edf"; //當把"def"賦值給str,原來的"abc"就變成了垃圾
System.out.println(str); //String類重寫了toString方法返回的是該物件的本身
}
}
4_String類的構造方法*
-
A:常見構造方法
- public String():空構造
- public String(byte[] bytes):把位元組陣列轉成字串
- public String(byte[] bytes,int index,int length):把位元組陣列的一部分轉成字串
- public String(char[] value):把字元陣列轉成字串
- public String(char[] value,int index,int count):把字元陣列的一部分轉成字串
- public String(String original):把字串常量值轉成字串
-
B:案例演示
- 演示String類的常見構造方法
5_String類的常見面試題*
-
1.判斷定義為String型別的s1和s2是否相等
- String s1 = “abc”;
- String s2 = “abc”;
- System.out.println(s1 == s2); //true 兩個常量指向同一個地址值
- System.out.println(s1.equals(s2)); //true
-
2.下面這句話在記憶體中建立了幾個物件?
- String s1 = new String(“abc”);//兩個物件地址值,常量池一個,堆記憶體一個
-
3.判斷定義為String型別的s1和s2是否相等
- String s1 = new String(“abc”);
- String s2 = “abc”;
- System.out.println(s1 == s2); //false
- System.out.println(s1.equals(s2));//true
-
4.判斷定義為String型別的s1和s2是否相等
- String s1 = “a” + “b” + “c”;在編譯時把abc賦值給s1
- String s2 = “abc”;
- System.out.println(s1 == s2); //true java中有常量優化機制
- 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
6_String類的判斷功能*
-
A:String類的判斷功能
- boolean equals(Object obj):比較字串的內容是否相同,區分大小寫
- boolean equalsIgnoreCase(String str):比較字串的內容是否相同,忽略大小寫
- boolean contains(String str):判斷大字串中是否包含小字串
- boolean startsWith(String str):判斷字串是否以某個指定的字串開頭
- boolean endsWith(String str):判斷字串是否以某個指定的字串結尾
- boolean isEmpty():判斷字串是否為空。
- “”和null的區別
- “”是字串常量,同時也是一個String類的物件,既然是物件當然可以呼叫string類中的方法
- null是空常量,不能呼叫任何方法,否則會出現空指標異常,null常量可以給任意的引用資料型別賦值。
package net.allidea.string;
public class String_4 {
public static void main(String[] args) {
// demo1();
// demo2();
String s1 = "zheng";
String s2 = "";
String s3 = null;
System.out.println(s1.isEmpty());
System.out.println(s2.isEmpty());
System.out.println(s3.isEmpty()); //java.lang.NullPointerException
}
private static void demo2() {
String s1 = "歡樂啦啦啦,嘿嘿";
String s2 = "啦";
String s3 = "哈哈";
String s4 = "歡樂";
String s5 = "嘿嘿";
System.out.println(s1.contains(s2)); //判斷是否包含傳入的字串
System.out.println(s1.contains(s3));
System.out.println("--------------------------------");
System.out.println(s1.startsWith(s4));
System.out.println(s1.endsWith(s5));
}
private static void demo1() {
String s1 = "allidea";
String s2 = "allidea";
String s3 = "Allidea";
System.out.println(s1.equals(s2));
System.out.println(s2.equals(s3));
System.out.println("----------------------");
System.out.println(s1.equalsIgnoreCase(s2));
System.out.println(s1.equalsIgnoreCase(s3)); //不區分大小寫
}
7_模擬使用者登入*
-
A:案例演示
- 需求:模擬登入,給三次機會,並提示還有幾次。
- 使用者名稱和密碼都是admin
- 分析
- 1.模擬登陸,需要鍵盤錄入,scanner
- 2.給三次機會,需要迴圈,用for
- 3.並提示有幾次,需要判斷,if
public class String_test_1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i ++) {
System.out.println("請輸入使用者名稱:");
String userName = sc.nextLine();
System.out.println("請輸入密碼");
String password = sc.nextLine();
//如果是字串常量和字串變數比較,都是字串常量呼叫方法,將變數當作引數傳遞,防止空指標異常
if ("admin".equals(userName) && "123456".equals(password)) {
System.out.println("歡迎" + userName + "登入");
break; //跳出迴圈
} else {
if (i == 2) {
System.out.println("您的次數已到,請明天再來吧");
}
System.out.println("輸入錯誤,您還有" + (2 - i) + "次機會,請重新輸入。");
}
}
}
}
8_String類的獲取功能*
-
A:String類的獲取功能
- int length():獲取字串的長度。
- char charAt(int index):獲取指定索引位置的字元
- int indexOf(int ch):返回指定字元在此字串中第一次出現處的索引。
- int indexOf(String str):返回指定字串在此字串中第一次出現處的索引。
- int indexOf(int ch,int fromIndex):返回指定字元在此字串中從指定位置後第一次出現處的索引。
- int indexOf(String str,int fromIndex):返回指定字串在此字串中從指定位置後第一次出現處的索引。
- lastIndexOf
- String substring(int start):從指定位置開始擷取字串,預設到末尾。
- String substring(int start,int end):從指定位置開始到指定位置結束擷取字串。
public class String_test_2 {
public static void main(String[] args) {
// demo1();
// demo2();
// demo3();
String s1 = "allidea";
String s2 = s1.substring(3);
System.out.println(s2);
String s3 = s1.substring(0, 2); //包含頭,不包含尾,左閉右開
System.out.println(s3);
}
private static void demo3() {
String s1 = "allidea.net";
int index1 = s1.indexOf("i",2); //從指定位置向後找
System.out.println(index1);
int index2 = s1.indexOf("i"); //從後向前找,第一次出現的字元
System.out.println(index2);
int index3 = s1.lastIndexOf(`a`,7);
System.out.println(index3);
}
private static void demo2() {
String s1 = "allidea";
int index = s1.indexOf(`a`); //引數接收的是int型別的,傳遞char型別會自動提升。
System.out.println(index);
int index2 = s1.indexOf(`f`); //如果不存在返回的是-1
System.out.println(index2);
int index3 = s1.indexOf("ll"); //獲取字串中第一個字元出現的位置
System.out.println(index3);
int index4 = s1.indexOf("lf"); //如果不存在返回的是-1
System.out.println(index4);
}
private static void demo1() {
// int[] arr = {11,22,33};
// System.out.println(arr.length); //陣列中的length是屬性
String s1 = "allidea";
System.out.println(s1.length()); //length()是一個方法,獲取的是每一個字元的個數。
String s2 = "你吃了嗎?";
System.out.println(s2.length());
char c = s2.charAt(3); //根據索引獲取對應位置的字元
System.out.println(c);
char c2 = s2.charAt(8);
System.out.println(c2); //StringIndexOutOfBoundsException字串索引越界異常
}
}
9_字串的遍歷*
-
A:案例演示
- 需求:遍歷字串
public class String_test_2 {
public static void main(String[] args) {
String s = "allidea";
for (int i = 0; i < s.length(); i++) { //通過for迴圈獲得自字串的索引
// char c = s.charAt(i);
// System.out.print(c);s
System.out.print(s.charAt(i)); //通過索引獲取每一個字元
}
}
}
10_統計不同型別字元個數*
-
A:案例演示
- 需求:統計一個字串中大寫字母字元,小寫字母字元,數字字元出現的次數,其他字元出現的次數。
- ABCDEabcd123456!@#$%^
public class String_test_3 {
// 分析:字串都是由字元組成的,而字元的值都是有範圍的,通過範圍來判斷是否包括該字元
// 如果包含就讓計數器變數自增
public static void main(String[] args) {
String s = "ABCDEabcd123456!@#$%^*/";
int big = 0;
int small = 0;
int num = 0;
int other = 0;
//1.獲取每一個字元,for迴圈遍歷
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i); //通過索引獲取每一個字元
//2.判斷字元是否在這個範圍內
if (c >= `A` && c <= `Z`) {
big++; //如果滿足大寫字母,就讓其對應的變數自增
} else if (c >= `a` && c <= `z`) {
small++; //如果滿足小寫字母,就讓其對應的變數自增
} else if (c >= `0` && c <= `9`) {
num++; //如果滿足數字,就讓其對應的變數自增
} else {
other++; //如果滿足大寫字母,就讓其對應的變數自增
}
}
//列印每一個計數器的結果
System.out.println(s + "中的大寫字母有:" + big + "個,小寫字母有:" + small + "個,數字有:" + num + "個,特殊符號有:" + other + "個。");
}
}
11_String類的轉換功能*
-
A:String的轉換功能:
- byte[] getBytes():把字串轉換為位元組陣列。
- char[] toCharArray():把字串轉換為字元陣列。
- static String valueOf(char[] chs):把字元陣列轉成字串。
-
static String valueOf(int i):把int型別的資料轉成字串。
- 注意:String類的valueOf方法可以把任意型別的資料轉成字串
- String toLowerCase():把字串轉成小寫。(瞭解)
- String toUpperCase():把字串轉成大寫。
- String concat(String str):把字串拼接。
import net.allidea.bean.Person;
public class String_6 {
public static void main(String[] args) {
// demo1();
// demo2();
// demo3();
String s1 = "ALLIDEA";
String s2 = "chengxuyuan";
String s3 = s1.toLowerCase();
String s4 = s2.toUpperCase();
System.out.println(s3);
System.out.println(s4);
System.out.println(s3 + s4);//用+拼接字串更強大,可以用字串與任意型別相加
System.out.println(s3.concat(s4));
}
private static void demo3() {
char[] arr = {`a`,`b`,`c`};
String s = String.valueOf(arr);//底層是由String類的構造方法完成的,把字元陣列轉成字串
System.out.println(s);
String s2 = String.valueOf(100);//將100轉換為字串
System.out.println(s2);
Person p1 = new Person("張三",23);
System.out.println(p1);
String s3 = String.valueOf(p1); //呼叫的是物件的toString方法
System.out.println(s3);
}
private static void demo2() {
String s = "allidea";
char[] arr = s.toCharArray(); //將字串轉換為字元陣列
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
private static void demo1() {
String s1 = "abc";
byte[] arr = s1.getBytes();
for (int i = 0; i < arr.length; i++) {
// System.out.print(arr[i] + "");
}
String s2 = "你好你好";
byte[] arr2 = s2.getBytes(); //通過gbk碼錶將字串轉換成位元組陣列,一箇中文代表兩個位元組
for (int i = 0; i < arr2.length; i++) {//gbk碼錶特點,中文的第一個位元組肯定是負數
// System.out.print(arr2[i] + "");
}
String s3 = "琲";
byte[] arr3 = s3.getBytes();
for (int i = 0; i < arr3.length; i++) {
System.out.print(arr3[i] + "");
}
}
}
12_按要求轉換字元(鏈式程式設計掌握)
-
A:案例演示
- 需求:把一個字串的首字母轉成大寫,其餘為小寫。(只考慮英文大小寫字母字元)
- 鏈式程式設計:只要保證每次呼叫完方法返回的是物件,就可以繼續呼叫。
public class String_test_4 {
public static void main(String[] args) {
String s = "allidea";
String s2 = s.substring(0, 1 ).toUpperCase().concat(s.substring(1).toLowerCase());
System.out.println(s2);
}
}
13_把陣列轉成字串
-
A:案例演示
-
需求:把陣列中的資料按照指定個格式拼接成一個字串
-
舉例:
- int[] arr = {1,2,3};
-
輸出結果:
- “[1, 2, 3]”
-
-
public class String_test_5 {
/* * 分析:
* 1.需要定義一個字串
* 2.遍歷陣列獲取每一個元素
* 3.用字串與陣列中的元素進行拼接
* */
public static void main(String[] args) {
int[] arr = {1,2,3};
String s = "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
s = s + arr[i] + "]";
} else {
s = s + arr[i] + ", ";
}
}
System.out.println(s);
}
}
14_String類的其他功能
-
A:String的替換功能及案例演示
- String replace(char old,char new)
- String replace(String old,String new)
-
B:String的去除字串兩空格及案例演示
- String trim()
-
C:String的按字典順序比較兩個字串及案例演示
- int compareTo(String str)(暫時不用掌握)
- int compareToIgnoreCase(String str)(瞭解)
public class String_test_6 {
public static void main(String[] args) {
// demo1();
// demo2();
String s1 = "abc";
String s2 = "de";
int num = s1.compareTo(s2); //按照碼錶值比較
System.out.println(num);
String s3 = "鄭";
String s4 = "成";
int num2 = s3.compareTo(s4);
System.out.println(`鄭` + 0); //查詢的是Unicode碼錶值
System.out.println(`成` + 0);
System.out.println(num2);
String s5 = "nihao";
String s6 = "NIHAO";
int num3 = s5.compareTo(s6);
System.out.println(num3);
int num4 = s5.compareToIgnoreCase(s6);
System.out.println(num4);
}
private static void demo2() {
String s = " all ide a ";
String s2 = s.trim();
System.out.println(s2);
}
private static void demo1() {
String s = "allidea";
String s2 = s.replace(`i`, `I`);//I替換i,若不存在,則不變
System.out.println(s2);
String s3 = s.replace("id", "ID");
System.out.println(s3);
}
}
15_字串反轉
-
A:案例演示
-
需求:把字串反轉
- 舉例:鍵盤錄入”abc”
- 輸出結果:”cba”
-
-
B:分析
- 1.通過鍵盤錄入字串scanner
- 2.將字串轉換成字元陣列
- 3.倒著遍歷字元陣列,並再次拼接成字串
- 4.列印
import java.util.Scanner;
public class String_test_7 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個字串:");
String line = sc.nextLine(); //將鍵盤錄入的字串儲存在line中
char[] arr = line.toCharArray(); //將字串轉換成陣列
String s = "";
for (int i = arr.length - 1; i >= 0; i--) { //倒著遍歷陣列
s = s + arr[i]; //拼接成字串
}
System.out.println(s);
}
}
16_在大串中查詢小串出現的次數
-
A:思路圖解
- 需求:統計大串中小串出現的次數
- 這裡的大串和小串可以自己根據情況給出
-
B:程式碼實現-案例演示
- 統計大串中小串出現的次數
public class String_test_8 {
/* 分析
1.定義計數器變數,變數為0
2.通過indexOf方法在大串中找小串
如果沒有返回-1程式結束
如果有則返回索引值
3.根據獲取的索引值,加上小串的長度,擷取大串,將擷取後的結果賦值給大串。
4.回到第二部,繼續
5.返回-1,程式結束。
*/
public static void main(String[] args) {
String max = "nizhidaoma,wozhingshiyaochengweiyidaijavadashendenanren,zhidaoma,zhi.";//定義大串
String min = "zhi"; //定義小串
int count = 0; //定義計數器變數
int index = 0; //定義索引
while ((index = max.indexOf(min)) != -1) { //定義迴圈,判斷小串是否在大串中出現
count++; //計數器自增
max = max.substring(index + min.length());
}
System.out.println(count);
}
}
17_編碼題
- 驗證鍵盤輸入的使用者名稱不能為空,長度大於6,不能有數字(提示:使用字串String類的相關方法完成)。
import java.util.Scanner;
public class Other_11_test {
public static void main(String[] args) {
login();
}
private static void login() {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入使用者名稱:");
for (int i = 0; i < 6; i++) {
String s = sc.nextLine();
if (checkNum(s)) {
System.out.println("驗證成功!");
break;
} else {
if (i == 5) {
System.out.println("您的次數已到,請明天再來吧");
break;
}
System.out.println("您還有" + (5 - i) + "次機會,請重新輸入。");
}
}
}
public static boolean checkNum(String str) {
String msg = "";
boolean flag = true;
if (str.isEmpty()) {
msg += "不能為空,";
flag = false;
}
if (str.length() <= 6) {
msg += "長度不能少於6,";
flag = false;
}
if (getNum(str) && str.length() <= 6) {
msg += "且";
flag = false;
}
if (getNum(str)) {
msg += "不能含有數字,";
flag = false;
}
if (flag == false) {
System.out.print(msg);
}
return flag;
}
private static boolean getNum(String s) {
final String number = "0123456789";
for (int j = 0; j < s.length(); j++) {
if (number.indexOf(s.charAt(j)) != -1) {
return true;
}
}
return false;
}
}