重踏学习Java路上_Day12(Scanner,String)

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:统计大串中小串出现的次数

原文地址:https://www.cnblogs.com/canceler/p/4607275.html