12.01 Scanner的概述和构造方法原理
Scanner类概述:JDK5以后用于获取用户的键盘输入
构造方法:public Scanner(InputStream source)
public static final InputStream in:“标准”输入流。
此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
12.02 Scanner类的hasNextXxx()和nextXxx()方法的讲解
基本格式:
hasNextXxx():判断是否还有下一个输入项,其中Xxx可以是Int,Double等。
如果需要判断是否包含下一个字符串,则可以省略Xxx
nextXxx():获取下一个输入项。Xxx的含义和上个方法中的Xxx相同
默认情况下,Scanner使用空格,回车等作为分隔符
常用方法:
public int nextInt(int radix):将输入信息的下一个标记扫描为一个int
public String nextLine():此扫描器执行当前行,并返回跳过的输入信息。此方法返回当前行的其余部分,不包括结尾处的行分隔符。
12.03 Scanner获取数据出现的小问题及解决方案
例:
1 //先获取一个int值,再获取一个字符串 2 Scanner sc = new Scanner(System.in); 3 int x = sc.nextInt(); 4 String s = sc.nextLine(); 5 System.out.println("x:"+x+" s:"+s);
运行结果:
10 x:10 s:
上例中先获取一个int值,再获取一个字符串时,字符串的值是空的,因为Scanner使用空格回车等作为分隔符,当回车换行时将换行符号赋给了s
解决方案:
1:重新创建对象
2:都以字符串形式接收,然后把字符串转成int类型
12.04 String类的概述
String类概述:字符串是由多个字符组成的一串数据(字符序列),字符串可以看成是字符数组,字符串是常量;它们的值在创建之后不能更改。
12.05 String类的构造方法
构造方法:
1. public String():
初始化一个新创建的 String 对象,使其表示一个空字符序列。注意,由于 String 是不可变的,所以无需使用此构造方法
2. public String(byte[] bytes):
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String
3. public String(byte[] bytes,int offset,int length):
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String
4. public String(char[] value):
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列
5. public String(char[] value,int offset,int count):
分配一个新的 String,它包含取自字符数组参数一个子数组的字符
6. public String(String original):
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本
例:
1 //空构造 2 String s1 = new String(); 3 System.out.println("s1"+s1);//s1 4 //将字节数组转成字符串 5 byte[] bys = {97,98,99,100,101}; 6 String s2 = new String(bys); 7 System.out.println("s2:"+s2);//s2:abcde 8 //输出字符串的长度 9 System.out.println(s2.length());//5 10 //将字节数组的一部分转成字符串 11 String s3 = new String(bys,1,3); 12 System.out.println("s3:"+s3);//s3:bcd 13 //将字符数组转成字符串 14 char[] ch = {'a','b','c','d','e','我'}; 15 String s4 = new String(ch); 16 System.out.println("s4:"+s4);//s4:abcde我 17 //将字符数组的一部分转成字符串 18 String s5 = new String(ch,2,4); 19 System.out.println("s5:"+s5);//s5:cde我
12.06 String的特点
String的特点:一旦被赋值就不能改变
String s = “hello”; s += “world”; s的结果是多少?
String s = “hello”; 在方法区的字符串常量池中创建hello
s += “world”;在方法区的字符串常量池中创建world ,再创建空间拼接helloworld
s的结果为helloworld
12.07 String字面值对象和构造方法创建对象的区别
String s = new String(“hello”) 和 String s = “hello”;的区别?
有区别,String s = new String(“hello”);分别在堆内存与方法区创建2个对象
String s = “hello”;只在方法区创建1个对象
12.08 String面试题看程序写结果
题1:
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 String s1 = new String("hello"); 6 String s2 = new String("hello"); 7 System.out.println(s1==s2);//false 8 System.out.println(s1.equals(s2));//true 9 10 String s3 = new String("hello"); 11 String s4 = "hello"; 12 System.out.println(s3==s4);//false 13 System.out.println(s3.equals(s4));//true 14 15 String s5 = "hello"; 16 String s6 = "hello"; 17 System.out.println(s5==s6);//true 18 System.out.println(s5.equals(s6));//true 19 } 20 }
题2:
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 //字符串如果是变量相加,先开空间,再拼接。 6 //字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建。 7 String s1 = "hello"; 8 String s2 = "world"; 9 String s3 = "helloworld"; 10 System.out.println(s3 == s1 + s2);//false 11 System.out.println(s3.equals(s1 + s2));//true 12 System.out.println(s3 == "hello" + "world");//true 13 System.out.println(s3.equals("hello" + "world"));//true 14 } 15 }
12.09 String类的判断功能
1. public boolean equals(Object anObject):
将此字符串与指定的对象比较
2. public boolean equalsIgnoreCase(String anotherString):
将此 String 与另一个 String 比较,不考虑大小写
3. public boolean contains(CharSequence s):
当且仅当此字符串包含指定的 char 值序列时,返回 true
4. public boolean startsWith(String prefix):
测试此字符串是否以指定的前缀开始
5. public boolean endsWith(String suffix):
测试此字符串是否以指定的后缀结束
6. public boolean isEmpty():
当且仅当 length()为0时返回 true
例:
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 //创建字符串对象 6 String s1 = "helloworld"; 7 String s2 = "Helloworld"; 8 System.out.println("equals:"+s1.equals(s2)); 9 System.out.println("equalsIgnoreCase:"+s1.equalsIgnoreCase(s2)); 10 System.out.println("contains:"+s1.contains("hello")); 11 System.out.println("startsWith:"+s1.startsWith("he")); 12 System.out.println("isEmpty:"+s1.isEmpty()); 13 } 14 }
运行结果:
equals:false equalsIgnoreCase:true contains:true startsWith:true isEmpty:false
12.10 模拟用户登录案例
模拟登录,给三次机会,并提示还有几次
分析:
1:定义用户名和密码。已存在的。
2:键盘录入用户名和密码。
3:比较用户名和密码。如果都相同,则登录成功,如果有一个不同,则登录失败。
4:给三次机会,用循环改进,用for循环。
1 import java.util.Scanner; 2 public class Practice 3 { 4 public static void main(String[] args) 5 { 6 //定义用户名和密码 7 String username = "admin"; 8 String passworld = "12345"; 9 //键盘录入用户名和密码 10 Scanner sc = new Scanner(System.in); 11 12 for (int i = 0; i < 3; i++) 13 { 14 System.out.println("请输入用户名:"); 15 String name = sc.nextLine(); 16 System.out.println("请输入密码:"); 17 String pwd = sc.nextLine(); 18 if(name.equals(username) && pwd.equals(passworld)) 19 { 20 System.out.println("登录成功"); 21 break; 22 } 23 else 24 { 25 if(2 - i == 0) 26 { 27 System.out.println("账号被冻结"); 28 } 29 else 30 { 31 System.out.println("用户名或密码错误,还有"+(2 - i)+"次机会"); 32 } 33 } 34 } 35 } 36 }
12.11 断点查看模拟用户登录案例
12.12 模拟用户登录案例增强版加入猜数字游戏
1 import java.util.Scanner; 2 public class Practice 3 { 4 public static void main(String[] args) 5 { 6 //定义用户名和密码 7 String username = "admin"; 8 String passworld = "12345"; 9 //键盘录入用户名和密码 10 Scanner sc = new Scanner(System.in); 11 12 for (int i = 0; i < 3; i++) 13 { 14 System.out.println("请输入用户名:"); 15 String name = sc.nextLine(); 16 System.out.println("请输入密码:"); 17 String pwd = sc.nextLine(); 18 if(name.equals(username) && pwd.equals(passworld)) 19 { 20 System.out.println("登录成功,开始游戏"); 21 GuessNumberGame.start(); 22 break; 23 } 24 else 25 { 26 if(2 - i == 0) 27 { 28 System.out.println("账号被冻结"); 29 } 30 else 31 { 32 System.out.println("用户名或密码错误,还有"+(2 - i)+"次机会"); 33 } 34 } 35 } 36 } 37 }
1 import java.util.Scanner; 2 3 public class GuessNumberGame 4 { 5 private GuessNumberGame(){} 6 public static void start() 7 { 8 int num = (int)(Math.random()*100)+1; 9 //记录猜的次数 10 int count = 1; 11 Scanner sc = new Scanner(System.in); 12 System.out.println("请输入一个数:"); 13 int guess = sc.nextInt(); 14 while(guess != num) 15 { 16 if(guess > 100 || guess < 1) 17 { 18 System.out.println("数据只能在1~100之间,请重新输入:"); 19 guess = sc.nextInt(); 20 } 21 else if(guess > num) 22 { 23 System.out.print("你猜的数"+guess+"大了,"); 24 count++; 25 System.out.println("进行第"+count+"次猜数:"); 26 guess = sc.nextInt(); 27 } 28 else 29 { 30 System.out.print("你猜的数"+guess+"小了,"); 31 count++; 32 System.out.println("进行第"+count+"次猜数:"); 33 guess = sc.nextInt(); 34 } 35 } 36 System.out.println("恭喜你,猜对了,用了"+count+"次机会"); 37 } 38 }
运行结果:
请输入用户名: sd 请输入密码: ger 用户名或密码错误,还有2次机会 请输入用户名: admin 请输入密码: 12345 登录成功,开始游戏 请输入一个数: 58 你猜的数58大了,进行第2次猜数: 45 你猜的数45大了,进行第3次猜数: 23 你猜的数23大了,进行第4次猜数: 12 你猜的数12大了,进行第5次猜数: 5 恭喜你,猜对了,用了5次机会
12.13 断点查看模拟用户登录案例增强版加入猜数字游戏
12.14 String类的获取功能
1. public int length():
返回此字符串的长度
2. public char charAt(int index):
返回指定索引处的 char 值。索引范围为从 0 到 length() - 1
3. public int indexOf(int ch):
返回指定字符在此字符串中第一次出现处的索引
4. public int indexOf(String str):
返回指定子字符串在此字符串中第一次出现处的索引
5. public int lastIndexOf(int ch,int fromIndex):
返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索
6. public int indexOf(String str,int fromIndex):
返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
7. public String substring(int beginIndex):
返回一个新的字符串,它是此字符串的一个子字符串
8. public String substring(int beginIndex,int endIndex):
返回一个新字符串,它是此字符串的一个子字符串
例:
1 String s = "helloworld"; 2 System.out.println("length:"+s.length()); 3 System.out.println("charAt:"+s.charAt(4)); 4 System.out.println("indexOf:"+s.indexOf('l')); 5 System.out.println("indexOf:"+s.indexOf("owo")); 6 System.out.println("substring:"+s.substring(2, 6));
运行结果:
length:10 charAt:o indexOf:2 indexOf:4 substring:llow
12.15 字符串的遍历
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 String s = "helloworld"; 6 for (int i = 0; i < s.length(); i++) 7 { 8 System.out.print(s.charAt(i)+" "); 9 } 10 } 11 }
运行结果:
h e l l o w o r l d
12.16 统计大写,小写及数字字符的个数案例
统计一个字符串中大写字母、小写字母、数字出现的次数
例:Hello123World 大写2个小写8个数字3个
分析:
前提:字符串要存在
1:定义三个统计变量
bigCount=0
smallCount=0
numberCount=0
2:遍历字符串,得到每一个字符。length()和charAt()结合
3:判断该字符到底是属于那种类型的
这道题目的难点就是如何判断某个字符是大的,还是小的,还是数字的。
char ch = s.charAt(x);
if(ch>='0' && ch<='9') numberCount++
if(ch>='a' && ch<='z') smallCount++
if(ch>='A' && ch<='Z') bigCount++
4:输出结果
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 //定义一个字符串 6 String s = "Hello123World"; 7 8 //定义三个统计变量 9 int bigCount = 0; 10 int smallCount = 0; 11 int numberCount = 0; 12 13 //遍历字符串,得到每一个字符。 14 for(int x = 0; x<s.length(); x++) 15 { 16 char ch = s.charAt(x); 17 18 //判断该字符到底是属于那种类型的 19 if(ch >= 'a' && ch <= 'z') 20 { 21 smallCount++; 22 } 23 else if(ch >= 'A' && ch <= 'Z') 24 { 25 bigCount++; 26 } 27 else if(ch >= '0' && ch <= '9') 28 { 29 numberCount++; 30 } 31 } 32 //输出结果 33 System.out.println("大写字母"+bigCount+"个"); 34 System.out.println("小写字母"+smallCount+"个"); 35 System.out.println("数字"+numberCount+"个"); 36 } 37 }
运行结果:
大写字母2个 小写字母8个 数字3个
12.17 断点查看统计大写,小写及数字字符的个数案例
12.18 String类的转换功能
1. public byte[] getBytes():
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中
2. public char[] toCharArray():
将此字符串转换为一个新的字符数组
3. public static String valueOf(char[] data):
返回 char 数组参数的字符串表示形式
4. public static String valueOf(long l):
返回 long 参数的字符串表示形式
5. public String toLowerCase():
使用默认语言环境的规则将此 String 中的所有字符都转换为小写
6. public String toUpperCase():
使用默认语言环境的规则将此 String 中的所有字符都转换为大写
7. public String concat(String str):
将指定字符串连接到此字符串的结尾
例:
1 //定义一个字符串 2 String s = "JavaSE"; 3 byte[] bys = s.getBytes(); 4 System.out.print("getBytes:"); 5 for (int i = 0; i < bys.length; i++) 6 { 7 System.out.print(bys[i]+" "); 8 } 9 System.out.println(); 10 char[] chs = s.toCharArray(); 11 System.out.print("toCharArray:"); 12 for (int i = 0; i < chs.length; i++) 13 { 14 System.out.print(chs[i]+" "); 15 } 16 System.out.println(); 17 String ss = String.valueOf(chs); 18 System.out.println("valueOf:"+ss);
运行结果:
getBytes:74 97 118 97 83 69 toCharArray:J a v a S E JavaSE
12.19 把字符串的首字母转大写其他转小写
例:helloWORLD 结果:Helloworld
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 //定义一个字符串 6 String s = "helloWORLD"; 7 String s1 = s.substring(0, 1); 8 String s2 = s.substring(1); 9 String ss = s1.toUpperCase().concat(s2.toLowerCase()); 10 System.out.println(ss); 11 12 //简化 13 String str = s.substring(0, 1).toUpperCase() 14 .concat(s.substring(1).toLowerCase()); 15 System.out.println(str); 16 17 } 18 }
12.20 String类的其他功能
1. public String replace(char oldChar,char newChar):
返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的
2. public String replace(String old,String new)
3. public String trim():返回字符串的副本,忽略前导空白和尾部空白
4. public int compareTo(String anotherString):按字典顺序比较两个字符串
5. public int compareToIgnoreCase(String str):按字典顺序比较两个字符串,不考虑大小写
如果没有字符不同的索引位置,则较短字符串的字典顺序在较长字符串之前。在这种情况下,compareTo 返回这两个字符串长度的差,即值:this.length()-anotherString.length()
例:
1 String s1 = "abc"; 2 String s2 = "hijk"; 3 String s3 = "xyz"; 4 String s4 = "hello"; 5 String s5 = "hel"; 6 7 System.out.println(s1.compareTo(s2));//-7 8 System.out.println(s3.compareTo(s1));//23 9 //返回的是这两个字符串长度的差 10 System.out.println(s4.compareTo(s5));//2
12.21 String类的compareTo()方法的源码解析
12.22 把int数组拼接字符串的案例
把数组中的数据按照指定个格式拼接成一个字符串例:int[] arr = {1,2,3}; 输出结果:[1, 2, 3]
1 String s = "["; 2 for (int i = 0; i < arr.length; i++) 3 { 4 if(i == arr.length-1) 5 { 6 s += arr[i]; 7 s += "]"; 8 } 9 else 10 { 11 s += arr[i]; 12 s += ", "; 13 } 14 } 15 return s;
12.23 把int数组拼接成字符串的案例改进版
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 int [] arr = {12,43,11}; 6 String s = getString(arr); 7 System.out.println(s); 8 } 9 public static String getString(int[] arr) 10 { 11 String s = "["; 12 for (int i = 0; i < arr.length; i++) 13 { 14 if(i == arr.length-1) 15 { 16 s += arr[i]; 17 s += "]"; 18 } 19 else 20 { 21 s += arr[i]; 22 s += ", "; 23 } 24 } 25 return s; 26 } 27 }
12.24 字符串反转的案例
字符串反转例:键盘录入"abc" 输出结果:"cba"
1 import java.util.Scanner; 2 3 public class Practice 4 { 5 public static void main(String[] args) 6 { 7 //定义一个空的字符串 8 String s = " "; 9 Scanner sc = new Scanner(System.in); 10 System.out.println("请输入字符串:"); 11 String line = sc.nextLine(); 12 char[] ch = line.toCharArray(); 13 for (int i = ch.length - 1; i >= 0; i--) 14 { 15 s += ch[i]; 16 } 17 System.out.println(s); 18 } 19 }
12.25 在大串中查找小串出现的次数案例思路图解
统计大串中小串出现的次数
例:在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"中java出现了5次
12.26 在大串中查找小串出现的次数案例代码实现
12.27 在大串中查找小串出现的次数案例代码优化
1 public class Practice 2 { 3 public static void main(String[] args) 4 { 5 String s = "woaijavawozhenaijavawozhendeaijavaw" + 6 "ozhendehenaijavaxinbuxinwoaijavagun"; 7 String key = "java"; 8 int count = 0; 9 int index; 10 while((index = s.indexOf(key)) != -1) 11 { 12 count++; 13 s = s.substring(index+key.length()); 14 } 15 System.out.println(count); 16 } 17 }