Day12.01_____Scanner类
- 使用Scanner类
- Scanner scanner = new Scanner(System.in)
- nextInt()
- 获取一个整数型的数据
- nextline()
- 获取一个字符串型的数据
- 注意事项: nextline()检测到回车键的时候就会停止
- next()
- 获取一个字符串
- 注意事项: next()检测到空格的时候就会停止
- next基本数据类型()
- 返回值基本数据类型,获取对应基本数据类型的数据
- hasNext基本数据类型()
- 返回值boolean类型,检测用户输入的数据是否为对应的基本数据类型
- 返回值boolean类型,检测用户输入的数据是否为对应的基本数据类型
Day12.02_____String类
- String类的构造方法
- (1) public String(){}
- 通过该构造方法创建的String对象,默认值为空串""
- 1、null与""的区别:
(1) " "是String类的对象,可以调用String类中的任何方法;
(2) null是空值,不能调用任何方法,因为调用就会报空指针异常 - 2、注意事项:
String str = null;
System.out.print(str);不会报错
解释:print方法打印对象的引用时,如果值是null,就打印null,否则就 打印该引用调用toString()方法后的值
- 1、null与""的区别:
- 通过该构造方法创建的String对象,默认值为空串""
- (2) public String(byte[] bytes)
- 通过该构造方法创建的String对象,需要传入一个byte(字节)类型数组,可以将一个byte字节数组转换成一个字符串。在这个过程中,其实是将计算机看得懂的二进制转换成我们看得懂的字符串,它的转换是根据我们的默认字符集来定的,这个转换的过程我们称作解码
- (3) public String(byte[] bytes , Charset charset)
- 该构造方法创建String对象的实质和上面一样,唯一的不同是可以指定默认的字 符集,我们可以通过传入charset这个参数去指定默认字符集
- (4) public String(byte[] bytes , int offset , int length)
- 该构造方法创建String对象的实质和(2)一致,唯一的不同是可以指定转换的位置和个数,offset可以指定解码字符集bytes中第一个字符的下标,length可以指定转换的个数
- (5) public String(char[] value)
- 通过该构造方法创建String对象,可以将一个char类型的字符数组转换为一个字符串
- (6) public String(char[] value , int offset , int count)
- 通过该构造方法创建String对象,可以将一个char类型的字符数组转换为一个字符串,其中offset、count参数的含义与(4)相同
- (7) public String(String original)
- 通过该构造方法创建String对象,需要传入一个String类型的字符串
- (1) public String(){}
- String对象一旦本创建,不能被更改。例如:
String str = "abc";
str = "bcd";
System.out.print(str); //输出的结果是bcd
这里的bcd并不是修改了str,在内存中的实现是:首先看常量池中是否有bcd字符串,如果有bcd字符串就直接将其地址值赋值给str,而此时abc的地址值就没有引用再指向它,它就变成了垃圾;如果常量池中没有bcd字符串,那就现在常量池中创建bcd字符串,再把bcd的地址值给str引用。因此由此可以看出,String对象一旦被创建,就是不可被修改的。
Day12.03_____String类面试题
- 第一题:
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); true
System.out.println(s1.equals(s2)); true
解释: String s1 = “abc”,会进入方法区中的常量池,这个池子的特点为先看常量池中是否已经有了"abc"对象,如果有就直接记录住"abc" 对象的地址值,如果没有就创建"abc"对象的地址值,所以s1、s2指 向同一地址值
- 第二题:String str = new String(“abc”);这句话在内存中创建了几个对象? 2
- 解释:根据内存图解释:
- (1) 首先String str进入栈内存;
- (2) String类比较特殊,即使后面是new关键字,也不会先去堆内存,而是先到常量池中看有没有"abc"这个对象,如果有就直接将"abc"对象副本复制 给堆内存中的对象,如果没有就先创建一个"abc"对象,再将其值复制给堆内存中的对象;
- (3) 创建完对象后,将常量池中的对象值副本给堆内存中的对象;
- (4) 将堆内存中对象的地址值赋值给str引用;因此这里有两个对象一个常量池中的对象,一个堆内存中的对象
- 解释:根据内存图解释:
- 第三题:
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); false
System.out.println(s1.equals(s2)); true
解释:综合上面两点知识点解释即可
- 第四题:
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2); true
System.out.println(s1.euqals(s2)); true
解释:Java中有一个常量优化机制,当"a"+“b”+"c"进入常量池时,常量池已经将其变成了一个"abc"字符串,然后再把地址值给s1,因此s2再指向时,常量池中已经存在"abc"字符串,s2也会指向同一地址值
- 第五题:
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.print(s2 == s3); false
System.out.print(s2.equals(s3)); true
解释:因为s2+"c"是一个变量+常量,所以不会有常量优化机制。根据内存图来解释:
(1) "ab"进入常量池,并将其地址赋值给s1引用;
(2) “abc"进入常量池,并将其地址赋值给s2引用;
(3) 对于s3的理解,首先在堆内存中创建一个StringBuilder对象(或者StringBuffer对象)调用其中的append()方法将s2与"c"连接形成"abc”,然后创建一个 String对象,把StringBuilder对象调用toString()方法的结果赋值给创建的String对象;
(4) 将创建的String对象的地址值赋值给引用s3
Day12.04_____String类的判断功能
- equals(Object obj)
- 返回值类型boolean,比较两个字符串值是否相同,区分大小写
- equalsIgnoreCase(String str)
- 返回值类型boolean,比较两个字符串值是否相同,不区分大小写
- contains(String str)
- 返回值类型boolean,判断某字符串中是否包含字符串str
- startWith(String str)
- 返回值类型boolean,判断某字符串是否以字符串str开头
- endWith(String str)
- 返回值类型boolean,判断某字符串是否以字符串str结尾
- isEmpty()
- 返回值类型boolean,判断字符串是否为空
- 注意:为空和null不一样,空指的是" ",而为null的字符串不能调用方法,否则会报空指针异常
Day12.05_____String类的获取功能
- length()
- 返回值类型int,获取字符串的长度
- charAt(int index)
- 返回值类型char,获取指定索引位置的字符
- indexOf(int ch)
- 返回值类型int,返回指定字符在此字符串中第一次出现的索引
- indexOf(String str)
- 返回值类型int,返回指定字符串在此字符串中第一次出现的索引,需注意的是该返回的索引是字符串第一个字符的索引
- indexOf(int ch, int fromIndex)
- 返回值类型int,返回指定字符在此字符串中从指定位置出发后第一次出现的索引
- indexOf(String str, int fromIndex)
- 返回值类型int,返回指定字符串在此字符串中从指定位置出发后第一次出现的索引,其索引值同样也为字符串中第一个字符的位置
- lastIndexOf()
- 返回值类型int,方法的重载方法与indexOf()方法的重载方式一样,不同之处在于该方法是从后往前看,但索引值不变,也就是说比如在字符串"abcdabcd"中查找’c’,查找的时候是从最后面的d开始寻找,但最后一个d的索引值还是7,所以根据这个方法找’c’,返回的值为6
- substring(int start)
- 返回值类型String,返回从指定位置一直到末尾的字符串
- substring(int start, int end)
- 返回值类型String,返回从指定开始位置到指定结束位置的字符串,需要注意的是指定位置的时候,start的值能取,end的值不取,也就是数学中的左闭右开
- 返回值类型String,返回从指定开始位置到指定结束位置的字符串,需要注意的是指定位置的时候,start的值能取,end的值不取,也就是数学中的左闭右开
Day12.06_____String类的转换功能
- getBytes()
- 返回值类型byte[],把字符串转换成一个byte( 字节 )数组
- toCharArray()
- 返回值类型char[],把字符串转换成一个char( 字符 )数组
- valueOf(char[] chs)
- 返回值类型String,静态方法,把字符数组转换成字符串
- valueOf(int i)
- 返回值类型String,静态方法,把int类型数据转换成字符串
- 注意:String类的任意valueOf()方法可以把任意的数据类型转换成字符串
- toLowerCase()
- 返回值类型String,把字符串中所有大写字母转换成小写字母
- toUpperCase()
- 返回值类型String,把字符串中所有小写字母转换成大写字母
- concat(String str)
- 返回值类型String,把字符串拼接
- 返回值类型String,把字符串拼接
Day12.07_____String类的替换功能
- replace(char old, char new)
- 返回值类型String,在字符串中用新的字符替换旧的字符
- replace(String old, new String)
- 返回值类型String,在字符串中用新的字符串替换旧的字符串
- 注意:在替换时如果字符串中old字符(字符串)存在,就用new字符(字符串)去替换,如果不存在就返回原本的字符(字符串)
Day12.08_____String类的去除空格功能
- trim()
- 返回值类型String,去除字符串中前后的空格
- 返回值类型String,去除字符串中前后的空格
Day12.09_____String类的根据字典顺序(ASCA码表)比较两个字符串
- compareTo(String str)
- 返回值类型int,区分大小写
- compareToIgnoreCase(String str)
- 返回值类型int,不区分大小写
- 注意:
- (1) 为什么返回的是int类型的数,而不是boolean类型的?
- 因为int类型可以表示三种情况,大、小或相等而boolean类型只能表示两种情况,相等或不相等
- (2) 比较是如何比较的?
- 从两个字符串的第一个字符开始比较,根据ASCA码表开始进行比较,如果两个字符串的内容相同,长度不同,那么比较的就是两个字符串的长度
- (1) 为什么返回的是int类型的数,而不是boolean类型的?