JAVA基础【day10】:常用类

这辈子没办法做太多事情,所以每一件都要做到精彩绝伦。 --------史蒂夫.乔布斯

Object

(1)Object是类层次结构的根类,所有的类都直接或者间接的继承自Object类。
(2)Object类的构造方法有一个,并且是无参构造
    这其实就是理解当时我们说过,子类构造方法默认访问父类的构造是无参构造
(3)要掌握的方法:
    A:toString()
        返回对象的字符串表示,默认是由类的全路径+'@'+哈希值的十六进制表示。
        这个表示其实是没有意义的,一般子类都会重写该方法。
        如何重写呢?过程我也讲解过了,基本上就是要求信息简单明了。
        但是最终还是自动生成。
    B:equals()
        比较两个对象是否相同。默认情况下,比较的是地址值是否相同。
        而比较地址值是没有意义的,所以,一般子类也会重写该方法。
        重写过程,我也详细的讲解和分析了。
        但是最终还是自动生成。
(4)要了解的方法:
    A:hashCode() 返回对象的哈希值。不是实际地址值,可以理解为地址值。
    B:getClass() 返回对象的字节码文件对象,反射中我们会详细讲解    
    C:finalize() 用于垃圾回收,在不确定的时间
    D:clone() 可以实现对象的克隆,包括成员变量的数据复制,但是它和两个引用指向同一个对象是有区别的。
(5)两个注意问题;
    A:直接输出一个对象名称,其实默认调用了该对象的toString()方法。
    B:面试题 
        ==和equals()的区别?
        A:==
            基本类型:比较的是值是否相同
            引用类型:比较的是地址值是否相同
        B:equals()
            只能比较引用类型。默认情况下,比较的是地址值是否相同。
            但是,我们可以根据自己的需要重写该方法。

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student [name=" + this.name + ", age=" + this.age + "]";
    }
}

class StudentDemo {
    public StudentDemo() {
    }

    public static void main(String[] args) {
        Student s = new Student();
        System.out.println(s.hashCode());
        System.out.println(s.getClass().getName());
        System.out.println("--------------------");
        System.out.println(s.toString());
        System.out.println("--------------------");
        System.out.println(s.getClass().getName() + '@' + Integer.toHexString(s.hashCode()));
        System.out.println(s.toString());
        System.out.println(s);
        Student s1 = new Student("小源同学", 20);
        Student s2 = new Student("小源同学", 20);
         System.out.println(s1 == s2);
        System.out.println(s1 == s1);
        System.out.println("---------------");
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s1));
        System.out.println(s1.equals(s1));
        Student s4 = new Student("财源", 20);
        System.out.println(s1.equals(s4));
        Demo d = new Demo();
        System.out.println(s1.equals(d));
    }
}

Scanner

(1)在JDK5以后出现的用于键盘录入数据的类。
(2)构造方法:
        A:讲解了System.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对象
            b:把所有的数据都用字符串获取,然后再进行相应的转换
public class ScannerDemo {
    public static void main(String[] args) {
        // 创建对象
        Scanner sc = new Scanner(System.in);

        int x = sc.nextInt();
        
        System.out.println("x:" + x);
    }
}
- - - - - - - - - - - - - - - - - -
public class ScannerDemo {
    public static void main(String[] args) {
        // 创建对象
        Scanner sc = new Scanner(System.in);

        // 获取数据
        if (sc.hasNextInt()) {
            int x = sc.nextInt();
            System.out.println("x:" + x);
        } else {
            System.out.println("你输入的数据有误");
        }
    }
} 
package cn.itcast_03;

import java.util.Scanner;

/*
 * 常用的两个方法:
 *      public int nextInt():获取一个int类型的值
 *      public String nextLine():获取一个String类型的值
 * 
 * 出现问题了:
 *      先获取一个数值,在获取一个字符串,会出现问题。
 *      主要原因:就是那个换行符号的问题。
 * 如何解决呢?
 *      A:先获取一个数值后,在创建一个新的键盘录入对象获取字符串。
 *      B:把所有的数据都先按照字符串获取,然后要什么,你就对应的转换为什么。
 */
public class ScannerDemo {
    public static void main(String[] args) {
        // 创建对象
        Scanner sc = new Scanner(System.in);

        // 获取两个int类型的值
        // int a = sc.nextInt();
        // int b = sc.nextInt();
        // System.out.println("a:" + a + ",b:" + b);
        // System.out.println("-------------------");

        // 获取两个String类型的值
        // String s1 = sc.nextLine();
        // String s2 = sc.nextLine();
        // System.out.println("s1:" + s1 + ",s2:" + s2);
        // System.out.println("-------------------");

        // 先获取一个字符串,在获取一个int值
        // String s1 = sc.nextLine();
        // int b = sc.nextInt();
        // System.out.println("s1:" + s1 + ",b:" + b);
        // System.out.println("-------------------");

        // 先获取一个int值,在获取一个字符串
        // int a = sc.nextInt();
        // String s2 = sc.nextLine();
        // System.out.println("a:" + a + ",s2:" + s2);
        // System.out.println("-------------------");

        int a = sc.nextInt();
        Scanner sc2 = new Scanner(System.in);
        String s = sc2.nextLine();
        System.out.println("a:" + a + ",s:" + s);
    }
}

String

(1)多个字符组成的一串数据。
        其实它可以和字符数组进行相互转换。
(2)构造方法:
        A:public String():空构造
        B:public String(byte[] bytes):把字节数组转成字符串
        C:public String(byte[] bytes,int offset,int length):把字节数组的一部分转成字符串
        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"的区别?
(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:字符串的拼接
            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)字符串的功能(自己补齐方法中文意思)
        A:判断功能
            boolean equals(Object obj)
            boolean equalsIgnoreCase(String str)
            boolean contains(String str)
            boolean startsWith(String str)
            boolean endsWith(String str)
            boolean isEmpty()
        B:获取功能
            int length()
            char charAt(int index)
            int indexOf(int ch)
            int indexOf(String str)
            int indexOf(int ch,int fromIndex)
            int indexOf(String str,int fromIndex)
            String substring(int start)
            String substring(int start,int end)
        C:转换功能
            byte[] getBytes()
            char[] toCharArray()
            static String valueOf(char[] chs)
            static String valueOf(int i)
            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:按字典比较功能
                int compareTo(String str)
                int compareToIgnoreCase(String str) 
(6)字符串的案例
        A:模拟用户登录
        B:字符串遍历
        C:统计字符串中大写,小写及数字字符的个数
        D:把字符串的首字母转成大写,其他小写
        E:把int数组拼接成一个指定格式的字符串
        F:字符串反转
        G:统计大串中小串出现的次数
/*
 * 统计大串中小串出现的次数
 * 举例:
 *      在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun"
 * 结果:
 *      java出现了5次
 * 
 * 分析:
 *      前提:是已经知道了大串和小串。
 * 
 *      A:定义一个统计变量,初始化值是0
 *      B:先在大串中查找一次小串第一次出现的位置
 *          a:索引是-1,说明不存在了,就返回统计变量
 *          b:索引不是-1,说明存在,统计变量++
 *      C:把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
 *      D:回到B
 */
public class StringTest5 {
    public static void main(String[] args) {
        // 定义大串
        String maxString = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
        // 定义小串
        String minString = "java";

        // 写功能实现
        int count = getCount(maxString, minString);
        System.out.println("Java在大串中出现了:" + count + "次");
    }

    /*
     * 两个明确: 返回值类型:int 参数列表:两个字符串
     */
    public static int getCount(String maxString, String minString) {
        // 定义一个统计变量,初始化值是0
        int count = 0;

        /*
        // 先在大串中查找一次小串第一次出现的位置
        int index = maxString.indexOf(minString);
        // 索引不是-1,说明存在,统计变量++
        while (index != -1) {
            count++;
            // 把刚才的索引+小串的长度作为开始位置截取上一次的大串,返回一个新的字符串,并把该字符串的值重新赋值给大串
            // int startIndex = index + minString.length();
            // maxString = maxString.substring(startIndex);
            maxString = maxString.substring(index + minString.length());
            // 继续查
            index = maxString.indexOf(minString);
        }
        */
        
        int index;
        //先查,赋值,判断
        while((index=maxString.indexOf(minString))!=-1){
            count++;
            maxString = maxString.substring(index + minString.length());
        }

        return count;
    }
}

StringBuffer

(1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了
       一个字符串缓冲区类。StringBuffer供我们使用。
(2)StringBuffer的构造方法
        A:StringBuffer()
        B:StringBuffer(int size)
        C:StringBuffer(String str)
(3)StringBuffer的常见功能(自己补齐方法的声明和方法的解释)
        A:添加功能
        B:删除功能
        C:替换功能
        D:反转功能
        E:截取功能(注意这个返回值)
(4)StringBuffer的练习(做一遍)
        A:String和StringBuffer相互转换
            String -- StringBuffer
                构造方法
            StringBuffer -- String
                toString()方法
        B:字符串的拼接
        C:把字符串反转
        D:判断一个字符串是否对称
(5)面试题
        小细节:
            StringBuffer:同步的,数据安全,效率低。
            StringBuilder:不同步的,数据不安全,效率高。
        A:String,StringBuffer,StringBuilder的区别
        B:StringBuffer和数组的区别?
(6)注意的问题:
        String作为形式参数,StringBuffer作为形式参数。
package cn.itcast_01;

/*
 * 线程安全(多线程讲解)
 * 安全 -- 同步 -- 数据是安全的
 * 不安全 -- 不同步 -- 效率高一些
 * 安全和效率问题是永远困扰我们的问题。
 * 安全:医院的网站,银行网站
 * 效率:新闻网站,论坛之类的
 * 
 * StringBuffer:
 *      线程安全的可变字符串。
 * 
 * StringBuffer和String的区别?
 * 前者长度和内容可变,后者不可变。
 * 如果使用前者做字符串的拼接,不会浪费太多的资源。
 * 
 * StringBuffer的构造方法:
 *      public StringBuffer():无参构造方法
 *      public StringBuffer(int capacity):指定容量的字符串缓冲区对象
 *      public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
 *
 * StringBuffer的方法:
 *      public int capacity():返回当前容量。   理论值
 *      public int length():返回长度(字符数)。 实际值
 */
public class StringBufferDemo {
    public static void main(String[] args) {
        // public StringBuffer():无参构造方法
        StringBuffer sb = new StringBuffer();
        System.out.println("sb:" + sb);
        System.out.println("sb.capacity():" + sb.capacity());
        System.out.println("sb.length():" + sb.length());
        System.out.println("--------------------------");

        // public StringBuffer(int capacity):指定容量的字符串缓冲区对象
        StringBuffer sb2 = new StringBuffer(50);
        System.out.println("sb2:" + sb2);
        System.out.println("sb2.capacity():" + sb2.capacity());
        System.out.println("sb2.length():" + sb2.length());
        System.out.println("--------------------------");

        // public StringBuffer(String str):指定字符串内容的字符串缓冲区对象
        StringBuffer sb3 = new StringBuffer("hello");
        System.out.println("sb3:" + sb3);
        System.out.println("sb3.capacity():" + sb3.capacity());
        System.out.println("sb3.length():" + sb3.length());
    }
}

你可能感兴趣的:(JAVA基础【day10】:常用类)