Scanner
- 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
- 键盘录入:
- 整数输入:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
* 字符串输入:
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
- 问题:
- 如果同时整数输入和字符串输入就会导致,/r/n到字符串输入中
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
String n = sc.nextLine();
- 解决办法:
- 1.创建两次对象,但是浪费空间
- 2.键盘录入都用字符串,需要整数时,再进行转换
String
- 概述:
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。 - ==与equal的比较:
- ==在对字符串比较的时候,对比的是内存地址,而equals比较的是字符串内容,在开发的过程中,equals()通过接受参数,可以避免空指向。
- 推荐链接:(讲的非常清楚)
- 题目:
String a = "abc";
String b = "abc";
System.out.println(a == b);
System.out.println(a.equals(b));
结果:
true
true
解析:因为常量池的特点是,没有字符串对象的时候就创建,如果有就直接用
所以a和b都是在同一个地址,所以==比较的是地址值,所以返回的是true
String a = new String("abc");
创建了几个对象
解析:首先常量池会检查是否有abc,如果没有就创建一个,后面还有一个new一个String对象,就要进堆内存,堆内存就把常量池中的“abc”复制过来,并且把他的地址给String a。
答案:2个
String a = "abc";
String b = new String("abc");
System.out.println(a==b);
System.out.println(a.equals(b));
结果:
false
true
解析:因为a记录的是常量池中的地址,而b是堆内存的地址,所以a==b为false地址不一样,而equals方法是比较属性值,所以为true
- 4
String a = "a"+"b"+"c";
String b = "abc";
System.out.println(a==b);
System.out.println(a.equals(b));
结果:true,true
解析:java中有常量优化机制,会将“a”+“b”+“c”连接起来再赋给a,所以a和b的地址值是一样的。
- 5
String a = "ab";
String b = "abc";
String c = a + "c";
System.out.println(c==b);
System.out.println(c.equals(b));
结果为false,true
解析:因为在java语言中是通过底层将字符串连接,所以在堆中创建一个StringBuffer,通过append方法将a和“c”连接起来,再通过toString方法转换成String对象。再赋值给c。所以c的地址值不是常量池的,而是String对象创建出来的,所以c==b为false。
String的判断功能
- boolean equalsIgnoreCae(String str);//比较字符串是否相同,忽略大小写
String a = "abc";
String b = "ABC";
System.out.println(a.equalsIgnoreCase(b));
- boolean contains(String str);//判断大字符串是否包含小字符串
String a = "ab";
String b = "abc";
System.out.println(b.contains(a));
- boolean startsWith(String str);//判断字符串是否以某个指定字符串开头
String a = "ab";
String b = "abc";
System.out.println(b.startsWith(a));
- boolean endsWith(String str);//判断字符串是否以某个指定字符串结尾
String a = "bc";
String b = "abc";
System.out.println(b.endsWith(a));
- boolean isEmpty();//判断字符串是否为空(null表示没有任何对象,不是表示为空,所以不能用null,会报错。)
String的获取功能
- int length();//获取字符串的长度
String a = "abc";
System.out.println(a.length());//3
- char charAt(int index);//获取指定索引位置的字符
String a = "abc";
System.out.println(a.charAt(1));//b
- int indexOf(int ch);//返回指定字符在此字符串中第一次出现的索引
String a = "abc";
System.out.println(a.indexOf(97));//0
- int indexOf(String str);//返回指定字符串在此字符串中第一次出现处的索引
String a = "abc";
System.out.println(a.indexOf("a"));//0
- int indexOf(int ch,int fromIndex);//返回指定字符在此字符串中从指定位置后第一次出现处的索引。
String a = "woaizuguomuqin";
System.out.println(a.indexOf("o",3));//8
- int indexOf(String str,int fromIndex);//返回指定字符串在此字符串中从指定位置后第一次出现的索引
String a = "woaizuguomuqin";
System.out.println(a.indexOf("zu",3));//4
- String substring(int start);//从指定位置开始截取字符串,默认到末尾
String a = "woaizuguomuqin";
System.out.println(a.substring(3));//izuguomuqin
- String substring(int start,int end);//从指定位置开始到指定位置结束截取字符串
String a = "woaizuguomuqin";
System.out.println(a.substring(3,8));//izugu
String的转换功能
- byte[] getBytes();//把字符串转换为字节数组
String a = "abc";
byte[] b = a.getBytes();
for (byte byte1 : b) {
System.out.println(byte1);
}
结果:
97
98
99
- char[] toCharArray();//把字符串转换为字符数组
String a = "abc";
char[] b = a.toCharArray();
for (char c : b) {
System.out.println(c);
}
结果:
a
b
c
- static String valueOf(char[] chs);//把字符数组转成字符串(底层使用String构造方法完成)
char[] a = {'a','b','c'};
System.out.println(String.valueOf(a));//abc
- static String valueOf(int i);//把int类型的数据转成字符串
int n = 97;
System.out.println(String.valueOf(n));//97
String的其他功能
- 替换功能
- String replace(char old,char new);
- String replace(String old,String new);
String a = "abcd";
System.out.println(a.replace('c', 'q'));
String b = "efgh";
System.out.println(b.replace("ef", "ab"));
结果:
abqd
abgh
- 去除字符串两端的字符串
- String trim();
String a = " ab c ";
System.out.println(a.trim());