java_day10_Object、Scanner、String

一、Object类

java中所有的类默认都有一个共同的父类:Object

== 比较:
    1、比较的是两个基本数据类型的话,比较两个数值是否相等
    2、比较的是两个引用数据类型的话,比较的是两个对象的地址值是否相等

成员方法:
    int hashCode() 返回对象的哈希码值。 可以看作地址值的另外一种表现形式
    public final Class getClass() 返回此 Object的运行时类。 获取当前类的class文件对象, 一个类全局只有一个在方法区中
    public String toString()
        打印一个对象名,默认调用的是类中的toString()方法
        若我们自己没有编写该方法的话,默认使用父类Object类中的toString()
        而父类中默认的toString()打印是一个地址值
        我们今后打印一个对象名的时候,输出是地址值意义不大,我们今后更多的是想看一个对象中成员变量值的情况
        要想实现上面的输出成员变量值的话,重写toString()方法,这样调用的就是自己重写后的toString()
        自动生成即可

代码案例

class Student{
    String name;
    int age;

    public Student() {
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

public class ObjectDemo1 {
    public static void main(String[] args) {
//        Student s1 = new Student();
//        Student s2 = new Student();
//
//        System.out.println(s1.hashCode());
//        System.out.println(s2.hashCode());
//
//        System.out.println(s1==s2);
//
//        Class c1 = s1.getClass();
//        System.out.println(c1.getName());

        Student s1 = new Student("李刚", 18);
//        System.out.println(s1.hashCode());
//        System.out.println(s1.getClass().getName() );
//        System.out.println(s1.toString()); // com.shujia.day10.Student@4554617c
        //this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());

        System.out.println(s1.toString());
    }
}

public boolean equals(Object obj)
protected void finalize() 垃圾回收用的

equals()用法代码

import java.util.Objects;

class Student2{
    String name;
    int age;

    public Student2() {
    }

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

    @Override
    public String toString() {
        return "Student2{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student2 student2 = (Student2) o;
        return age == student2.age && Objects.equals(name, student2.name);
    }

}

public class ObjectDemo3 {
    public static void main(String[] args) {
        Student2 s1 = new Student2("李刚", 21);
        Student2 s2 = new Student2("李刚", 21);

        //默认情况下,若对象类中没有自己编写equals方法,默认使用的是父类中Object类中的equals方法
        //而父类中Object类中的equals方法底层调用的是==比较,若比较的是引用数据类型,比较的是地址值
        //而我们这里s1和s2接受的是不同两个对象的地址值,所以默认比较的结果是false
//        System.out.println(s1.equals(s2));
        //需求:当对象的姓名和年龄一样的时候,表示是同一个学生
        //比较的对象类中自己重写一个equals方法,自动生成即可
        System.out.println(s1.equals(s2));



    }
}
protected Object clone()

java中并不是所有的类都可以被克隆,只有授权的类的对象才可以使用克隆方法
我们通过阅读帮助文档后发现,若一个对象的类没有实现Cloneable接口的话,是不可以调用clone方法的
然后,我们再去看Cloneable接口的时候,发现该接口中没有任何抽象方法,今后像这样的接口称之为标记接口

克隆在IT行业中,称之为拷贝。
拷贝分为两种:
    1、浅拷贝
    2、深拷贝

面试题:Object类中的clone是浅拷贝还是深拷贝。答:是浅拷贝

代码案例

class Demo1 {
    int a = 10;


}

class Student3 implements Cloneable {
    String name;
    int age;
    Demo1 demo1;

    public Student3() {
    }

    public Student3(String name, int age, Demo1 demo1) {
        this.name = name;
        this.age = age;
        this.demo1 = demo1;
    }

    @Override
    public String toString() {
        return "Student3{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", demo1=" + demo1 +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

public class ObjectDemo4 {
    public static void main(String[] args) throws Exception {
        Demo1 d1 = new Demo1();


        Student3 s1 = new Student3("刘亦菲", 36, d1);
        System.out.println("s1: " + s1);
        System.out.println(s1.hashCode());
//        Student3 s2 = new Student3("章若楠", 21);

        System.out.println("===========================================");
        //首先,如果此对象的类不实现接口Cloneable ,则抛出CloneNotSupportedException 。
//        Object o1 = s1.clone();
        Object o1 = s1.clone();
        System.out.println("o1: " + o1);
        System.out.println(o1.hashCode());


    }
}

二、Scanner类

Scanner: 一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串。

构造方法:
    Scanner(InputStream source) 构造一个新的 Scanner ,产生从指定输入流扫描的值。

代码案例

import java.util.Scanner;


public class ScannerDemo1 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        //获取一个数字:
//        int i = sc.nextInt();
//        System.out.println(i);
//
//        String s1 = sc.next();
//        System.out.println(s1);

        //获取数字的时候,我们是不是只能够输入数字呢?
//        System.out.println("请输入一个数字:");
        //hasNextXxx()判断下一个输入的内容是否是指定类型
//        if(sc.hasNextInt()){
//            int i = sc.nextInt();
//            System.out.println(i);
//        }else {
//            System.out.println("您输入的内容不是一个int类型的值!");
//        }

//        int i = sc.nextInt();
//        System.out.println(i);
        String s1 = sc.next(); //无法接收换行等空白特殊字符
        System.out.println(s1);
        //输入字符串的另外一种方法
//        String s1 = sc.nextLine(); //可以接收换行等空白特殊字符
//        System.out.println(s1);


        System.out.println("hello world");
    }
}

三、String类

字符串:由若干个字符构成的字符序列叫做字符串
    String类代表字符串。
    Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。
    字符串不变; 它们的值在创建后不能被更改指的是字符串本身不能改
    因为String对象是不可变的,它们可以被共享。
    字符串可以被看作成一个字符数组

String类中的构造方法:

    public String()
    public String(byte[] bytes)
    public String(byte[] bytes,int offset,int length)
    public String(char[] value)
    public String(char[] value,int offset,int count)
    public String(String original)

代码案例

public class StringDemo2 {
    public static void main(String[] args) {
        //public String() 创建一个空字符串
        String s1 = new String(); // 堆内存
        System.out.println("s1: " + s1);

//        String s2 = ""; // 常量池
//        System.out.println(s1==s2);
        System.out.println("=============================");

        //public String(byte[] bytes) 将字节数组转成一个字符串
        byte[] bytes = {97,98,99,100,101,102};
        String s2 = new String(bytes);
        System.out.println("s2: "+s2);

        System.out.println("=============================");
        //public String(byte[] bytes,int index,int length) 从字节数组的某个位置开始,向后截取变成字符串
        String s3 = new String(bytes, 2, 3);
        System.out.println("s3: "+s3);
        System.out.println("=============================");
        //public String(char[] value)  //将一个字符数组转成一个字符串
        char[] chars = {'我','爱','中','华'};
        String s4 = new String(chars);
        System.out.println("s4: "+s4);
        System.out.println("=============================");
        //public String(char[] value,int index,int length) 将字符数组一部分转成字符串
        String s5 = new String(chars,1,2);
        System.out.println("s5: "+s5);
        System.out.println("=============================");
        //public String(String original) 将字符串封装成一个String对象在堆内存中
        String s6 = new String("你好");
        System.out.println("s6: "+s6);
    }
}

String类中的判断功能

String类中的判断功能:
    boolean equals(Object obj)
    boolean equalsIgnoreCase(String str)
    boolean contains(String str)
    boolean startsWith(String str)
    boolean endsWith(String str)
    boolean isEmpty()

代码案例

public class StringDemo4 {
    public static void main(String[] args) {
        //boolean equals(Object obj) 比较两个字符串的内容值
        String s1 = "hello";
        String s2 = "HellO";
        System.out.println(s1.equals(s2));
        //boolean equalsIgnoreCase(String str) 忽略大小写比较字符串内容值
        System.out.println(s1.equalsIgnoreCase(s2));
        //boolean contains(String str)  判断大字符串中是否包含某一个小字符串
        String s3 = "今天的天气还可以李刚决定去洗个脚";
        System.out.println(s3.contains("李刚决"));
        //boolean startsWith(String str) 判断字符串是否以某个字符串开头
        System.out.println(s3.startsWith("今天的天气数可以"));
        // boolean endsWith(String str) 判断字符串是否以某个字符串结尾
        System.out.println(s3.endsWith("洗个脚"));
        //boolean isEmpty() 判断字符串是否为空字符串,指的是内容是否为空
        String s4 = "";
        System.out.println(s4.isEmpty());
        String s5 = null;
//        System.out.println(s5.isEmpty()); // NullPointerException


    }
}

String类中的获取功能

String类中的获取功能:
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)

代码案例

public class StringDemo5 {
    public static void main(String[] args) {
        String s = "李刚在数加学院中学习非常快乐!";
        //int length() 获取字符串中的字符个数,字符串长度
        System.out.println(s.length());

        //char charAt(int index) 根据索引获取字符串中某一个字符
        //字符串可以被看作成一个字符数组
//        System.out.println(s.charAt(15)); // StringIndexOutOfBoundsException

        //int indexOf(int ch) 根据ascii码值获取对应字符所在的索引位置,左边起第一个
        String s2 = "qweasdsafqe";
        System.out.println(s2.indexOf(104)); // -1
        //int indexOf(int ch,int fromIndex) 从某个索引开始向后寻找某个字符,返回找到字符在整个大字符串中的索引位置
        System.out.println(s2.indexOf(97,5)); // 7

        //int indexOf(String str) 获取大字符串中小字符串的位置,返回小字符串第一个字符的索引
        System.out.println(s2.indexOf("sdsa")); // 4
        //int indexOf(String str,int fromIndex) 从某个索引开始向后寻找某个字符,返回找到字符串第一个字符在整个大字符串中的索引位置
        System.out.println(s2.indexOf("saf",3)); // 6

        //String substring(int start) // 从指定位置向后截取,返回新的字符串
        String s3 = "李刚是真的帅!江川很不服,钱志强觉得自己是最帅的!";
        String res1 = s3.substring(3);
        System.out.println(res1);

        //String substring(int start,int end) 截取字符串中的一部分 [start, end)
        String res2 = s3.substring(7, 12);
        System.out.println(res2);


    }
}

String转换功能

String转换功能:
    byte[] getBytes()
    char[] toCharArray()
    static String valueOf(char[] chs)
    static String valueOf(int i)
    String toLowerCase()
    String toUpperCase()
    String concat(String str)

代码案例

public class StringDemo6 {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        //byte[] getBytes() 将字符串转字节数组
        byte[] bytes = s1.getBytes();
        for(int i=0;i<bytes.length;i++){
            System.out.println(bytes[i]);
        }
        System.out.println("----------------");
        
//        for(byte b : bytes){
//            System.out.println(b);
//        }
//        System.out.println("----------------");
//        System.out.println(Arrays.toString(bytes));
//        System.out.println("----------------");
        //char[] toCharArray()  将字符串转字符数组
        char[] chars = s1.toCharArray();
        for(int i=0;i<chars.length;i++){
            System.out.println(chars[i]);
        }
        System.out.println("----------------");
        String s3 = new String(chars);
        System.out.println(s3);

        //static String valueOf(char[] chs) 将字符数组转字符串
        String s2 = String.valueOf(chars);
        System.out.println(s2);


        //static String valueOf(int i)
        System.out.println(String.valueOf(100)); // 100 -> "100"

        //String toLowerCase() 转小写
        String s4 = "HellOWOrlD";
        String res1 = s4.toLowerCase();
        System.out.println(res1);

        //String toUpperCase()
        String res2 = s4.toUpperCase();
        System.out.println(res2);

        //String concat(String str) 字符串拼接操作
        String res3 = "李刚".concat("真帅!");
        System.out.println(res3);


    }
}

String其它功能

String其它功能:
    替换功能
        String replace(char old,char new)
        String replace(String old,String new)
    去除字符串两空格
        String trim()
    按字典顺序比较两个字符串
        int compareTo(String str)
        int compareToIgnoreCase(String str)

代码案例

public class StringDemo7 {
    public static void main(String[] args) {
        String s1 = "dasqwajavadwqrajjavaiojadjavafq-aedjavaqajiqa";
        //String replace(char old,char new) 由新字符替换字符串中所有旧字符
        String res1 = s1.replace('a', '$');
        System.out.println(s1);
        System.out.println(res1);
        //String replace(String old,String new) 由新的字符串替换旧的字符串
        String res2 = s1.replace("java", "李刚");
        System.out.println(res2);
        //String trim() 去除字符串两边的空格
        String s2 = "    hello  world    ";
        System.out.println("s2: "+s2);
        String res3 = s2.trim();
        System.out.println("res3: "+res3);
        //int compareTo(String str) 按字典顺序比较两个字符串是否相同 当结果是0的时候表示两个字符串内容相同
        String s3 = "hello";
        String s4 = "world";
        String s5 = "hel";
        String s6 = "hello";
        System.out.println(s3.compareTo(s4)); // -15
        System.out.println(s3.compareTo(s5)); // 2
        System.out.println(s3.compareTo(s6)); // 0


    }
}

compareTo源码解释

class String{
    //s3.compareTo(s4)
    //s3 - "hello"
    //s4 - "hel"
    public int compareTo(String anotherString) {
        // this - "hello"
        // anotherString - "hel"
        int len1 = this.value.length; // 5
        int len2 = anotherString.value.length; // 3
        int lim = Math.min(len1, len2); // 3
        char[] v1 = value; // ['h','e','l','l','o']
        char[] v2 = anotherString.value; // ['h','e','l']
        int k = 0;

        while (k < lim) {
            char c1 = v1[k]; // 'h'  'e'  'l'
            char c2 = v2[k]; // 'h'  'e'  'l'
            if (c1 != c2) {
                return c1 - c2; // 104 - 119 = -15
            }
            k++;
        }
        return len1 - len2; // 5-3=2
    }
}
posted @ 2024-10-07 22:21  w我自横刀向天笑  阅读(5)  评论(0编辑  收藏  举报