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());
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,706评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,002评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,462评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,375评论 0 216
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,763评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,849评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,033评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,768评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,490评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,734评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,204评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,566评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,227评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,137评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,934评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,926评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,774评论 2 274

推荐阅读更多精彩内容