不冷博客

Java api、Object类和hashCode()方法-11月3日讲课内容

API概述

API(Application Programming Interface) 应用程序编程接口

编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令,没有编过程序的人很难想象这样的程序如何编写。但是对于有经验的开发人员来说,知道机器人厂商一定会提供一些用于控制机器人的Java类,这些类中定义好了操作机器人各种动作的方法。其实,这些Java类就是机器人厂商提供给应用程序编程的接口,大家把这些类称为Xxx Robot API。本章涉及的Java API指的就是JDK中提供的各种功能的Java类。

学习汉语和学习编程的异同点

相同点

不同点

Object 类

Object类是类层次结构的根类,所有类都直接或者间接的继承自该类

构造方法

public Object()

【注意】Object 只有一个无参构造方法

toString()

作用

用来返回对象的字符串表示形式

public String toString()

返回值为:包名.类名@当前对象在内存空间中的首地址

getClass().getName() + '@' + Integer.toHexString(hashCode())

重写toString()

由于默认情况下的数据对我们来说没有意义,一般会重写该方法用以展示对象的字段信息

public class Student {
    String name;
    int age;
    
    // 重写 toString 方法
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + "]";
    }
}

测试

public class TestStudent {
    public static void main(String[] args) {
        Student student = new Student("Buffer",23);        
        System.out.println(student);
    }
}

结果

Student [name=Buffer, age=23]

总结

toString方法用来展示一些对象的基本信息:完整的包名.类名@堆内存地址,通常我们用快捷键来重写这个方法来获取我们需要的数据信息

equals()

作用

用来比较两个对象的地址是否相同

public boolean equals(Object obj) {
        return (this == obj);
}

如果调用此方法的对象与 obj 的地址相同(即为同一个对象),返回true,否则返回false

重写equals()思路

一般需要重写 equals() 方法用以判断两个对象的字段是否相同

1、判断两个对象的地址是否相同
2、判断两个对象的类型是否一致
3、判断两个对象所存储的数据是否相同

重写equals()

public class Student {
    String name;
    int age;
    
    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {

        // 判断是否是同一个对象(地址相同),如果是返回 true
        if (this == obj) {
            return true;
        }

        // 判断数据类型是否一致,如果不一致返回 false
        if (!(obj instanceof Student)) {
            return false;
        }

        // 强制类型转换为当前类对象
        Student student = (Student) obj;

        // 所有字段全部满足时返回 true ,否则返回false
        return this.name.equals(student.name) && this.age == student.age;
    }
}

测试

public class TestStudent {
    public static void main(String[] args) {
        Student student1 = new Student("Buffer",23);
        Student student2 = new Student("Banlance",22);
        Student student3 = new Student("Buffer",23);
        
        System.out.println(student1.equals(student2));
        System.out.println(student1.equals(student3));
    }
}

结果

false
true

【注意】基本数据类型不能使用 equals() 方法

总结

1、equals方法用来判断两个对象是否相同,默认比较的是两个对象的内存首地址。我们可以通过重写equals方法实现对两个对象的比较

2、注意equals方法的调用者,不同的调用者调用方法是不一样的

hashCode()

作用

返回对象的哈希码值,具有唯一指向性

public int hashCode()

重写hashCode()

hashCode方法要求必须和 equals() 方法的结果是对应的,如果两个对象的 equals 的结果为 true ,那这两个对象的 hashCode 的值一定相同,所以只要重写了 equals 方法,就必须重写 hashCode 方法

public class Student {
    String name;
    int age;
    
    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }

        if (!(obj instanceof Student)) {
            return false;
        }

        Student student = (Student) obj;

        return this.name.equals(student.name) && this.age == student.age;
    }
    
    // 重写 hashCode 方法
    @Override
    public int hashCode() {
        // 调用 Objects 工具类的 hash 方法,根据传入的参数生成一个指定的 hashCode 值
        return Objects.hash(name, age);
    }
}

测试

public class TestStudent {
    public static void main(String[] args) {
        Student student1 = new Student("Buffer",23);
        Student student2 = new Student("Banlance",22);
        Student student3 = new Student("Buffer",23);
        
        System.out.println(student1.equals(student2));
        System.out.println(student1.equals(student3));

        System.out.println(student1.hashCode());
        System.out.println(student2.hashCode());
        System.out.println(student3.hashCode());    
    }
}

结果

false
true
1892650872
247063595
1892650872

student1 和 student3 的 equals 方法返回值是 true ,所以他们的 hashCode 值相同

总结

1、hashCode()用来获取当前对象的哈希值,表示对象的唯一标识。如果重写equals()则必须重写hashCode()方法

2、equals相同hashCode一定相同,hashCode相同equals不一定相同

getClass()

获取当前对象的 Class 对象(字节码对象),直接打印会显示包含完整的包名,类名的信息

public final native Class<?> getClass();
class Cat {}

public class GetClassDemo {
    public static void main(String[] args) {
        Cat cat = new Cat();
        System.out.println(cat.getClass());
    }
}

finalize()

protected void finalize()

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

总结

Object类是所有类的基类,提供了一个无参的构造方法和一些公共方法

通过重写toString方法来获取对象中的数据

通过重写equals方法和hashCode方法来判断两个对象是否相同,这两个方法必须同时重写

getClass用来获取Class对象

finalize方法用于垃圾回收,不可控

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »