1:Scanner的使用(了解)
(1)在JDK5以后出现的用于键盘录入数据的类。
(2)构造方法:
A:讲解了System.in这个东西。
它其实是标准的输入流,对应于键盘录入,in是System这个类中的最终静态变量:public static final InputStream; in “标准”输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
B:构造方法
InputStream is = System.in;
Scanner(InputStream is)
C:常用的格式
Scanner sc = new Scanner(System.in);
(3)基本方法格式:
A:hasNextXxx() 判断是否是某种类型的
B:nextXxx() 返回某种类型的元素
(4)要掌握的两个方法
A:public int nextInt()
B:public String nextLine()
(5)需要注意的小问题
A:同一个Scanner对象,先获取数值,再获取字符串会出现一个小问题。主要原因:就是那个换行符号的问题。
B:解决方案:
a:重新定义一个Scanner对象,Scanner sc2 = new Scanner(System.in);
b:把所有的数据都用字符串获取,然后再进行相应的转换
c:sc.nextLine();//用于清空换行回车字符即可清楚缓冲区多余的换行符
例子,数据类型不匹配:
public class ScannerDemo {
public static void main(String[] args) {
// 创建对象
Scanner sc = new Scanner(System.in);
// 获取数据
if (sc.hasNextInt()) {//增强健壮性,防止报错:InputMismatchException:输入的和你想要的不匹配
int x = sc.nextInt();
System.out.println("x:" + x);
} else {
System.out.println("你输入的数据有误");
}
}
}
例子 ,整数获取完毕,再获取字符串为空,原因:缓冲区还有上一个整数截取完留下的换行符
public class ScannerDemo {
public static void main(String[] args) {
int b = sc.nextInt();//只会读整数类型,其他什么都不会截取,但输入完回车,会留下一个换行符在缓冲区的
sc.nextLine();//用于清除换行回车字符
String s1 = sc.nextLine();
System.out.println("S1:"+s1+",b:"+b);
System.out.println("----------------");
}
}
2:String类的概述和使用(掌握)
(1)多个字符组成的一串数据,也可以看成是一个字符数组其实它可以和字符数组进行相互转换。字符串在底层会自动转化为value,一个字符数组,而且是final,所以不能更改。
通过查看API,我们可以知道:
注意:String类重写了equal()方法,比较的是内容是否相同
A.字符串字面值"abc"也可以看做是一个字符串对象。
B.字符串是常量,一旦被赋值,就不能改变。
API明确写道:Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
API例子:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
(2)构造方法:(注意:offset - 要解码的第一个 byte 的索引)
A:public String() //空构造
B:public String(byte[] bytes) //把字节数组转成字符串 字节码数组:arr={65,66,97,98,99,100,68} ,执行该构造方法后,会自动关联各数字下代表UniCode码,转化为字符串:ABabcdD
C:public String(byte[] bytes,int offset,int length) //把字节数组的一部分转成字符串 String s3 = new String(bys2,1,3); 从1开始,截取三个字符作为字符串
D:public String(char[] value) //把字符数组转成字符串
E:public String(char[] value,int offset,int count) //把字符数组的一部分转成字符串
F:public String(String original) //把字符串常量值转化为字符串
下面的这一个虽然不是构造方法,但是结果也是一个字符串对象
G:String s = "hello";
(3)字符串的特点
A:字符串一旦被赋值,就不能改变。
注意:这里指的是字符串的内容不能改变,而不是引用不能改变。
B:字面值作为字符串对象和通过构造方法创建对象的不同
String s = new String("hello");和String s = "hello"的区别?
字符串一旦被赋值,就不能改变图解:
String s = new String("hello");和String s = "hello"的区别:图解
(4)字符串的面试题(看程序写结果)
A:==和equals()
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3 == s4);// false
System.out.println(s3.equals(s4));// true
String s5 = "hello";
String s6 = "hello";
System.out.println(s5 == s6);// true
System.out.println(s5.equals(s6));// true
B:字符串的拼接
注意:1.字符串如果是变量与变量相加,会先开辟空间,再进行拼接,放到空间处
2.字符串如果是常量与常量相加,会先进行相加,然后在常量池中找,如果有会直接返回常量值地址,没有的话会在常量池开辟新空间存放,然后返回引用值
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false 这个理解很重要
System.out.println(s3.equals((s1 + s2)));// true
System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true 这个理解很重要
System.out.println(s3.equals("hello" + "world"));// true
(5)字符串的功能
特别注意: 字符串内容为空 和 字符串对象为空,还有一点就是,要想调用方法,一定要先创造对象,没有对象怎么调用方法,不然就会报错:空指针异常NullPointerException
字符串内容为空:是指对象存在,但没有数据 例:String s = "";
字符串对象为空:是指对象都不存在 例:String s = null;
A:判断功能
boolean equals(Object obj) //比较字符串的内容是否相同,区分大小写
boolean equalsIgnoreCase(String str) //比较字符串的内容是否相同,忽略大小写
boolean contains(String str) //判断大的字符串是否包含晓得字符串
boolean startsWith(String str) //判断字符串是否以某个指定的字符串开头
boolean endsWith(String str) //判断字符串是否以某个指定的字符串结尾
boolean isEmpty() //判断字符串是否为空,只能是存在实例对象的变量能调用 "".isEmpty(),输出true
B:获取功能
int length() //获取字符串的长度
char charAt(int index) //获取指定索引位置的字符
int indexOf(int ch) //返回指定字符在此字符串中第一次出现处的索引
为什么这里是int类型的ch,而不是char类型的ch?
原因是:'a'和97其实都可以代表'a',而如果变为char就会出现输入整数就会报错,因为需要强制转换,而int会自动识别'a'为97。
int indexOf(String str) //返回指定字符串在此字符串中第一次出现处的索引,记住,找不到不会报错,会返回-1
int indexOf(int ch,int fromIndex) //返回指定字符在此字符串中从指定位置后第一次出现处的索引 ,记住,找不到不会报错,会返回-1
int indexOf(String str,int fromIndex) //返回指定字符串在此字符串中从指定位置后第一次出现处的索引 ,记住,找不到不会报错,会返回-1
String substring(int start) //从指定位置开始截取字符串,默认到末尾,指定位置start也是包含的
String substring(int start,int end) //从指定位置开始到指定位置结束截取字符串,包含start位置字符,但不包含end位置的字符。
C:转换功能
byte[] getBytes() //把字符串转换为字节数组
char[] toCharArray() //把字符串转换为字符数组
static String valueOf(char[] chs) //把字符数组转换为字符串
static String valueOf(int i) //把int类型的数据转换成字符串
String toLowerCase() //把字符串转换成小写 ,返回的新串会全部小写,但原来的字符串是不会改变的
String toUpperCase() //把字符串转换成大写,返回的新串会全部大写,但原来的字符串是不会改变的
String concat(String str) //把字符串拼接
D:其他功能
a:替换功能
String replace(char old,char new)
String replace(String old,String new)
b:去空格功能,只能去除字符串头部跟尾部的空格,中间的空格是不会删除的
String trim()
c:按字典比较功能,比较的是第一个字母,若两边第一个字母不同,用第一个的ASCII值减去第二个的ASCII值,然后然会相减后的值,若第一个字符两边一样就接着比下一个字符,只要不限差不为0就返回,若读取完还是为0就返回,说明两个的字符串序列是一样的。让内容相同,长度不一样,即"hel".compareTo("hello"),这样的情况,源码写了,会返回两个长度之差,所以会等于-2.
int compareTo(String str)
int compareToIgnoreCase(String str)
(6)字符串的案例
A:模拟用户登录
B:字符串遍历
C:统计字符串中大写,小写及数字字符的个数
D:把字符串的首字母转成大写,其他小写
E:把int数组拼接成一个指定格式的字符串
F:字符串反转
G:统计大串中小串出现的次数