Day12
-
常见对象(Scanner的概述和方法介绍)
(1) Scanner的概述
(2) Scanner的构造方法原理
Scanner(InputStream source)
System类下有一个静态的字段:
public static final InputStream in;标准的输入流,对应着键盘录入。
(3) 一般方法
hasNextXxx() 判断是否还有下一个输入项,其中Xxx可以是Int,Double等。如果需要判断是否包含下一个字符串,则可以省略Xxx;
nextXxx() 获取下一个输入项。Xxx的含义和上一个方法中的Xxx相同,默认情况下,Scanner使用空格,回车等作为分隔符。 -
常见对象(Scanner 获取数据出现的小问题及解决方案)
(1) 两个常用方法:
public int nextInt ():获取一个int类型的值
public String nextLine():获取一个String类型的值
(2) 案例演示
先演示获取多个int值,多个String值的情况;
再演示先获取int值,然后获取String值出现问题;
问题解决方案:
第一种:先获取一个数值后,在创建一个新的键盘录入对象获取字符串。
第二种:把所有的数据都先按照字符串获取,然后要什么,你就对应转换成什么。
package come.heima.scanner;
import java.util.Scanner;
public class Demo2_Scanner {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
/*System.out.println("请输入第一个整数:");
int i = sc.nextInt();
System.out.println("请输入第二个整数:");
int j = sc.nextInt();
System.out.println("i = " + i + ", j = " + j);*/
/*System.out.println("请输入第一个字符串:");
String line1 = sc.nextLine();
System.out.println("请输入第二个字符串:");
String line1 = sc.nextLine();
System.out.println("line1 = " + line1 + ",line2 = " + line2);*/
/*
* nextInt()是键盘录入整数的方法,当我们录入10的时侯
* 其实就是在键盘上录入10和\r\n,nextInt()方法只获取10就结束了
* nextLine()是键盘录入字符串的方法,可以接收任意类型,但是他凭什么能获取一行呢?
* 通过\r\n,只要遇到\r\n就证明一行结束了。
*
*/
/*System.out.println("请输入第一个个整数:");
int i = sc.nextInt();
System.out.println("请输入第二个字符串:");
String line2 = sc.nextLine(); //将nextInt()和nextLine()和其一起用,这一句录入不进去
System.out.println("i = " + i + ",line2 = " + line2);*/
/*
* 解决方法1:创建两次对象,但是浪费空间
* 解决方法2:键盘录入的都是字符串,都有nextLine()放法,后面将会学习将整数字符串转换成整数的方法
*
*/
int i = sc.nextInt();
Scanner sc2 = new Scanner(System.in);
String line = sc2.nextLine();
System.out.println(i);
System.out.println(line);
}
}
- 常见对象(String类的概述)
(1) String类的概述
通过JDK提供的API,查看String类的说明
package com.heima.string;
public class Demo1_String {
public static void main(String[] args) {
String str = "abc"; //”abc"可以看成一个字符串对象
str = "def"; //当把def赋值给str时,原来的“abc”就变成了垃圾
System.out.println(str); //String 类重写了toString方法,返回的是该对象本身
}
}
可以看到这样的两句话。
A:字符串字面值”abc”也可以看成是一个字符串对象。
B:字符串是常量,一旦被赋值,就不能被改变。
4. 常见对象(String类的构造方法)
(1) 常见构造方法
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 originals):把字符串常量值转成字符串。
(2) 案例演示:演示String类的常见构造方法。
package com.heima.string;
public class Demo2_StringCon {
public static void main(String[] args) {
String s1 = new String(); //空构造,实际就是创造空字符串
System.out.println(s1);
byte[] arr1 = {97,98,99};
String s2 = new String(arr1); //解码,将计算机读的懂的转换成我们读的懂得。
System.out.println(s2);
byte[] arr2 = {97,98,99,100,101,102};
String s3 = new String(arr2,2,3); //将arr2字节数组从2索引开始转换3个
System.out.println(s3);
char[] arr3 = {'a','b','c','d','e'}; //将字符数组转换成字符串
String s4 = new String (arr3);
System.out.println(s4);
String s5 = new String(arr3,1,3);//将arr3字符数组从12索引开始转换3个
System.out.println(s5);
String s6 = new String("heima");
System.out.println(s6);
}
}
- 常见对象(String类的常见面试题)
(1) 判断定义String类型的s1和s2是否相等
String s1 = “abc”; //String类为引用数据类型
String s2 = “abc”; //常量池中如果没有该字符串对象就重新创建一个,有就直接用
System.out.println(s1 == s2); //true,因为s1和s2指向同一个地址
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,因为s1指向堆中的地址,s2指向常量池中的地址
System.out.println(s1.equals (s2));//true
(4) 判断定义为String类型的s1和s2是否相等。
String s1 = ‘a’ + ‘b’ + ‘c’;//在编译时就变成了”abc”
String s2 = “abc”;
System.out.println(s1 == s2); // true,因为Java中有常量优化机制,
System.out.println(s3.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类的判断功能)
(1) String类的判断功能
boolean equals(Obiect obj):比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str): 比较字符串的内容是否相同,忽略大小写
boolean constrains(String str):判断大字符串是否包含小字符串
boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
boolean isEmpty():判断字符串是否为空
(2) ” ”和null的区别
“ ”时字符串常量,同时也是一个String类的对象,既然是对象当然也可以调用String类中的方法;
null是空常量,不能调用任何方法否则会出现空指针异常,null可以给任意的引用数据类型赋值。
- 常见对象(模拟用户登录)
(1) 案例演示
需求:模拟登录,给三次机会,并提示还有几次。
用户名和密码都是admin.
package com.heima.test;
import java.util.Scanner;
public class Test1 {
/*
* 需求:模拟登录,给三次机会,并提示还有几次。
用户名和密码都是admin.
分析1:模拟登陆,需要键盘录入,Scanner
2.给三次机会,需要循环,for
3.并提示有几次,需要判断,if
*/
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(); // 键盘录入的用户名存储在userName中
System.out.println("请输入密码:");
String password = sc.nextLine(); // 将键盘录入密码存储在password中
//如果是字符串常量和字符串变量比较,通常都是字符串常量调研方法,将变量当作参数传递,防止空指针异常
if("admin".equals(username) && "admin".equals(password)) {
System.out.println("欢迎" + username + "登录");
break; //跳出循环
}else {
if(i == 2) {
System.out.println("您的错误次数已到,请您明天再来");
} else {
System.out.println("录入错误,您还有" + (2-i) + "次机会");
}
}
}
}
}
- 常见对象(String类的获取功能)
(1) 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):从指定位置开始到指定位置结束截取字符串。
package com.heima.string;
public class Demo5_StringMethod {
public static void main(String[] args) {
//面试题
String s = "woaiheima";
s.substring(4); //substring会产生一个新的字符串,需要将新的字符串记录才能使用
System.out.println(s); //打印的还是"woaiheima"
}
private static void Demo4() {
String s1 = "heimawudi";
String s2 = s1.substring(5);//从第5个开始截取,包含第五个
System.out.println(s2);
String s3 = s1.substring(0,4); //包含头,不包含尾,左闭右开
System.out.println(s3);
}
private static void Demo3() {
String s1 = "woaiheima";
int index1 = s1.indexOf('a',3); //从指定位置开始向后找
System.out.println(index1);
int index2 = s1.lastIndexOf('a',7);//从指定位置向前找
System.out.println(index2);
}
private static void Demo2() {
String s1 = "heima";
int index = s1.indexOf('a'); //参数接收的是int类型的,传递char类型的会自动提升
System.out.println(index);
int index2 = s1.indexOf('z'); //如果不存在,返回值就为-1
System.out.println(index2);
int index3 = s1.indexOf("ma"); //获取字符串中第一个字符出现的位置
System.out.println(index3);
int index4 = s1.indexOf("ia"); //如果不是连着的字符,系统找不到对应的,会返回-1
System.out.println(index4);
}
- 常见对象(字符串的遍历)
(1) 案例演示:
需求:遍历字符串
package com.heima.test;
public class Test2 {
public static void main(String[] args) {
String s = "heima";
for(int i = 0;i < s.length(); i++) { //通过for循环获取到字符串中每个字符的索引
char c = s.charAt(i);
System.out.println(c); //通过索引获取每一个字符
}
}
}
- 常见对象(统计不同类型字符个数)
(1) 案例演示:
需求:统计一个字符串大写字母字符,小写字母字符,数字字符出现的次数。
ABCDEabcd123456!@#$%^
package com.heima.test;
public class Test3 {
/*ABCDEabcd123456!@#$%^
* 需求:统计一个字符串大写字母字符,小写字母字符,数字字符出现的次数。
* 分析:字符串是由字符组成的,而字符的值都是有范围的,通过范围来判断是否包含该字符
* 如果包含就让计数器变量自增
*/
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++;
}
}
//3.打印每一个计时器的结果
System.out.println(s + "中大写字母有:" + big + "个,小写字母有:" + small +
"个,数字字符:" + num + "个,其他字符有:" + other + "个");
}
}
- 常见对象(String类的转换功能)
(1) 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): 把字符串拼接。
package com.heima.string;
import com.heima.bean.Person;
public class Demo6_StringMethod {
public static void main(String[] args) {
String s1 = "heiMA";
String s2 = "chengxuYUAN";
String s3 = s1.toLowerCase();
String s4 = s2.toLowerCase();
System.out.println(s3);
System.out.println(s4)
System.out.println(s3 + s4); //用+拼接更强大,可以用字符串与任意类型相加
System.out.println(s3.concat(s4)); //用concat方法调用着和传入者都必须是字符串
}
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 + 100); //字符串与其他类型用+连接都会变成字符串类型
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 = "heima";
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] + " "); // 编码:把我们看的懂的转换成计算机看的懂的
//gbk码表特点:中文的第一个字节肯定是负数
}
String s3 = "琲";
byte[] arr3 = s3.getBytes();
for (int i = 0; i < arr3.length; i++) {
System.out.println(arr3[i] + " ");
}
}
}
- 常见对象(按照要求转换字符)
(1) 案例演示:需求,把一个字符串的首字母转化成大写,其余转化成小写。
package com.heima.test;
public class Test4 {
//链式编程:只要保证每次调用完方法返回的是对象,就可以继续使用
public static void main(String[] args) {
String s = "woaiHEImaniaima";
String s2 = s.substring(0,1).toUpperCase().concat(s.substring(1).toLowerCase());
System.out.println(s2);
}
}
- 常见对象(把数组转成字符)
(1)案例演示
需求:把数组的数据按照指定格式拼接成一个字符串
举例:int[] arr = {1,2,3}
输出结果:”[1, 2, 3]”
package com.heima.test;
public class Test5 {
/*
* 举例:int[] arr = {1,2,3}
输出结果:”[1, 2, 3]”
分析:1:需要定义一个字符串"["
2:遍历数组获取每一个元素
3:用字符串与数组中的元素进行拼接
*/
public static void main(String[] args) {
int[] arr = {1,2,3};
String s = "["; //定义一个字符串来与数组中的元素进行拼接
for (int i = 0; i < arr.length; i++) { //{1,2,3}
if(i == arr.length - 1) {
s = s + arr[i] + "]";
}else {
s = s + arr[i] + ", ";
}
}
System.out.println(s);
}
}
- 常见对象(String类的其他功能)
(1) String的替换功能及案例演示
String replace (char old,char new)
String replace(String old,String new)
(2) String的去除字符串辆空格及案例演示
String trim()
(3) String的按字典顺序比较两个字符串及案例演示
int compareTo(String str)
int compareToIgnoreCase(String str)
package com.heima.string;
public class Demo7_StringMethod {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "bcd";
int num = s1.compareTo(s2); //按顺序比较两个字符串,按照码表值进行比较
System.out.println(num);
String s3 = "黑";
String s4 = "马";
int num1 = s3.compareTo(s4);
System.out.println('黑' + 0); //查找的是unicode码表
System.out.println('马' + 0);
System.out.println(num1);
String s5 = "heima";
String s6 = "HEIMA";
int num3 = s5.compareTo(s6);
System.out.println(num3);
int num4 = s5.compareToIgnoreCase(s6); //不区分大小写,比较得0
System.out.println(num4);
}
private static void Demo2() {
String s = " hei ma ";
String s2 = s.trim(); //去掉两端的空格
System.out.println(s2);
}
private static void Demo1() {
String s = "heima";
String s2 = s.replace('i', 'o');//用O替换i
System.out.println(s2);
String s3 = s.replace('z', 'o');//z不存在,保留原字符不变
System.out.println(s3);
String s4 = s.replace("ei", "ao");
System.out.println(s4);
}
}
- 常见对象(字符串反转)
(1) 案例演示
需求:把字符串反转
举例:键盘录入”abc” -------输出结果”cba”
package com.heima.test;
import java.util.Scanner;
public class Test6 {
/*
* 需求:把字符串反转
举例:键盘录入”abc” -------输出结果”cba”
分析:
1.通过键盘录入获取字符串Scanner
2.将字符串转换成字符数组
3.倒着遍历字符数组,并再次拼接成字符串
4。打印
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //创建键盘录入对象
System.out.println("请输入一个字符串");
String line = sc.nextLine();
char[] arr = line.toCharArray(); //将字符串转换成字符数组
String s2 = "";
for(int i = arr.length-1; i >= 0 ; i--) { //倒着遍历字符数组
s2 = s2 + arr[i]; //拼接成字符串
}
System.out.println(s2);
}
}
-
常见对象(在大串中查找小串出现的次数思路图解)
(1) 画图演示
需求:统计大串中小串出现的次数
这里的大串可以根据自己的情况给出 -
常见对象(在大串中查找小串出现的次数代码实现)
(1) 案例演示:统计大串中小串出现的次数。
package com.heima.test;
public class Test7 {
/*
* 需求:统计大串中小串出现的次数
这里的大串可以根据自己的情况给出
分析:1:定义计数器变量,变量为0
2:通过indexOf方法,在大串中找小串,如果没有返回-1程序结束;如果有返回索引值
3:根据获取的索引值加上小串的长度,截取大串,将截取后的结果赋值给大串
4:回到第二步,接着判断
*/
public static void main(String[] args) {
//定义大串
String max = "woaiheima,heimabutongyubaima,wulunheimahaishibaima,zhaodaogongzuojiushihaoma";
//定义小串
String min = "heima";
//定义计数器变量
int count = 0;
//定义索引
int index = 0;
//定义循环,判断小串是否在大串中出现
while ((index = max.indexOf(min)) != -1) {
count++; //计数器自增
max = max.substring(index + min.length());//从发现重复项后截取大串
}
System.out.println(count);
}
}