day12-Scanner类和String类

12.1 Scanner类

  • 一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器
  • 定义: public final class Scanner extends Object
12.1.1 Scanner基本键盘录入
Scanner scanner = new Scanner(System.in); //控制台键盘录入
System.out.println("请输入一个int数,输入0退出!");
while (true) {
    if (scanner.hasNextInt()) {  //判断输入的内容,Scanner有很多判断类型的方法
        int number = scanner.nextInt();
        if ( 0 == number) break;
        System.out.println("输入的内容是: " + number);
    }else {
        System.err.println("输入类型不是int。退出程序。");
        break;
    }
}
scanner.close();

//nextInt()是键盘录入整数的方法,当我们录入10的时候
//其实键盘上录入的是10和\r\n,nextInt()方法只获取了10就结束了
//nextLine()是键盘录入字符串的方法,可以接收任意类型,通过\r\n来判断录入一行是否结束
解决方法:1,创建2个Scanner对象;2,使用nextLine()接收。

12.2 String类

  • a: 字符串字面值"abc"也可以看成一个字符串对象
  • b: 字符串是常量,一旦赋值,就不能被改变

使用构造方法初始化的例子:

byte[] arr1 = {97,98,99,45};
String s1 = new String(arr1);  //通过byte数组初始化
System.out.println(s1);  //输出 abc-(通过当前平台的字符集码表,来解码成字符串的)

byte[] arr2 = s1.getBytes(); //字符串又转为码表值
System.out.println(arr2[0]+".."+arr2[1]);

char data[] = {'a','c','z','o','5'};
String s2 = new String(data);    //字符串成串,就是字符串
System.out.println(s2);
12.2.1 String面试题
// 第一题 (常量池属于方法区的一部分)
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);      //?为什么?因为同样值的字符串,在常量池只有一份,所以地址值也相等
System.out.println(s1.equals(s2)); //肯定是true

// 第二题 下面这句话在内存中创建了几个对象?
String s3 = new String("abc");
// 答:2个,常量池一个,然后拷贝副本一个到 堆内存一个(因为有new),栈区的s3指向堆内存的"abc"

// 第三题
String a1 = new String("abc");
String a2 = "abc";
System.out.println( a1 == a2); //false 一个堆地址,一个常量池地址
System.out.println( a1.equals(a2));  //肯定是true

// 第四题
String q1 = "a" + "b" + "c";
String q2 = "abc";
System.out.println( q1 == q2); //true,Java中有常量优化机制,a-b-c相加,编译时就优化成了abc
System.out.println( q1.equals(q2));  //肯定是true

// 第五题
String z1 = "ab";
String z2 = "abc";
String z3 = z1 + "c";  //这里是 变量 + 常量,跟上面abc相加是不一样的
System.out.println(z2 == z3); //false 一个在堆内存,一个在常量池
System.out.println(z2.equals(z3));   //肯定是true
day12-Scanner类和String类_第1张图片
第五题内存图.png
day12-Scanner类和String类_第2张图片
字符串内存.png
12.2.2 String常用判断方法
boolean equals(Object anObject) //比较两个字符串是否相同,区分大小写
boolean equalsIgnoreCase(String anotherString) //比较两个字符串是否相同,忽略大小写
boolean contains(CharSequence s) //判断字符串是否包含字符串s
boolean startsWith(String s) //判断字符串是否以某个字符串s开头
boolean endsWith(String s) //判断字符串是否以某个字符串s结尾
boolean isEmpty() //判断字符串是否为空(长度为0)

"" 和 null 的区别
"" 是字符串常量,同时也是String类对象,可以调用String类的所有方法
null 是空常量,不能调用任何方法,否则出现空指针异常,null可以给任何引用数据类型赋值!

12.2.2 String的获取功能(截取)
int length() //获取字符串的长度(数组的长度是属性,字符串的长度是方法)
char charAt(int index) //获取字符串指定位置的字符(可能字符串索引越界异常)
int indexOf(char c) //获取字符c在字符串中出现的第一个位置,无则返回-1
int indexof(String str) //返回字符串str在字符串出现的第一个位置,无则返回-1
int indexOf(int ch, int fromIndex)  //字符在字符串中出现的第一个位置,从fromIndex开始匹配
int indexOf(String ss, int fromIndex)  //字符串在字符串中出现的第一个位置,从fromIndex开始匹配
lastIndexOf(xx) //跟indexof相反,从结尾开始匹配位置,值还是从正开始的,无则返回-1


String substring(int beginIndex) //从指定位置截取字符串(包含此位置),默认到末尾。
String substring(int beginIndex, int endIndex)  //截取字符串,从哪截取到哪,包含头,不含尾
12.2.2 String的遍历
String string = "遍历字符串";
for (int i = 0; i < string.length(); i++) {
    System.out.println(string.charAt(i));
}
12.2.2 题目:统计不同类型字符的个数
// 需求:统计字符串中大写字符,小写字符,数字字符,其他字符出现的次数
//分析:字符值都是有范围的,通过范围来判断是否包含该字符
String string = "Aabbcc123*&^$-a1@";
int big = 0, small=0, num=0, other=0;

for (int i = 0; i < string.length(); i++) {
    char c = string.charAt(i);
    if (c >= 'A' && c <= 'Z') big++;
    else if (c >= 'a' && c <= 'z') small++;
    else if (c >= '0' && c <= '9') num++;
    else other++;
}
12.2.4 String常用转换方法
byte[] getBytes() //把字符串转为码表值(中文有时候是GBK码表)
char[] toCharArray() //把字符串转为char数组
static String valueOf(char data[])  //把字符数组,转为字符串
static String valueOf(int i)     //把int转为字符串
static String valueOf(double d)  //把double转为字符串
    //valueOf可以将任意类型的对象,转为字符串

String toLowerCase() //将字符串转为小写
String toUpperCase() //将字符串转为大写
String concat(String str)  //字符串拼接,没有 + 号拼接强大
12.2.5 题目:转换字符
//需求: 把第一个字符串首字母大写,其余小写
String s = "loveXXOO";
String re = s.substring(0, 1).toUpperCase().concat(s.substring(1).toLowerCase());
System.out.println(re);  //注意上面的链式编程,前期可以分开写
12.2.5 题目:把数组转为字符串
int[] arr = {1,3,5,68};
String string = "[";
for (int i = 0; i < arr.length; i++) {
    if (i == (arr.length - 1))  //其实根据运算符号的优先级,不加里面的()也是可以的
        string = string + arr[i] + "]";
    else 
        string = string + arr[i] + ",";
}  // if else 不加{},是为了节省篇幅,建议加上

System.out.println(string);
12.2.6 String的其他功能
String replace(char old, char new) //替换字符串中的字符,返回新的字符串。不存在返回原字符串

String replace(String old, String new) //同上
String trim()  //去掉字符串两端的空格,中间不会去掉

int compareTo(String ss) //比较两个字符串,按照码表值比较(Unicode)
int compareToIgnoreCase(String str) //比较2个字符串,不区分大小写
12.2.7 题目:字符串反转
String s = "123456", s2 = "";

for (int i = 0; i < s.length(); i++) {
    s2 = s.charAt(i) + s2;
}

System.out.println(s2);
12.2.8 题目:字符串出现的次数
// 需求:求s2在s中出现的个数
String s = "qwe12-qwe12-qwe12-qwe12-qwe12-";
String s2 = "12";

int count = 0 ;    //出现的次数
int formIndex = 0; //从什么位置开始匹配
while ( (formIndex = s.indexOf(s2)) != -1 ) {
    count++;
    s = s.substring(formIndex+s2.length());
}
System.out.println(count);

END。
我是小侯爷。
在魔都艰苦奋斗,白天是上班族,晚上是知识服务工作者。
如果读完觉得有收获的话,记得关注和点赞哦。
非要打赏的话,我也是不会拒绝的。

你可能感兴趣的:(day12-Scanner类和String类)