• Java Object类方法简要解释(equals, hashCode, toString, finalize)


    ==和equals的对比

    ==是一个比较运算符
    1.== : 既可以判断基本类型,又可以判断引用类型
    2.== : 如果判断基本类型,判断的是值是否相等。
    3 如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象
    4.equals: 是Object类中的方法, 只能判断引用类型,如何看Jdk源码, 看老师演示:
    5.默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer, String (看看String 和Integer的equals源代码]

    Object的equals

        public boolean equals(Object obj) {
            return (this == obj);
        }
    
    • 1
    • 2
    • 3

    String的equals

        public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            if (anObject instanceof String) {
                String anotherString = (String)anObject;
                int n = value.length;
                if (n == anotherString.value.length) {
                    char v1[] = value;
                    char v2[] = anotherString.value;
                    int i = 0;
                    while (n-- != 0) {
                        if (v1[i] != v2[i])
                            return false;
                        i++;
                    }
                    return true;
                }
            }
            return false;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    Integer的equals

        public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20221112113313739

    重写Object子类的equals方法
    public class Person {
        private String name;
        private int age;
        private char gender;
    
    
        @Override
        public boolean equals(Object obj) {
    
            if (this == obj) {// 如果两个对象是同一个对象, 则直接返回true
                return true;
            }
            if (obj instanceof Person) {// 是Person我们才比较
                // 进行类型转换, 向下转型 
                Person p = (Person) obj;
                return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    image-20221112115622067

    image-20221112115938418

    hashCode方法

    返回该对象的哈希码值。支持此方法是为了提高哈希表(例如java.util.Hashtable提供的哈希表)的性能。

    1)提高具有哈希结构的容器的效率!
    2)两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!
    3)两个引用,如果指向的是不同对象,则哈希值是不一样的
    4)哈希值主要根据地址号来的! ,不能完全将哈希值等价于地址。
    5)案例演示[HashCode java]: obj.hashCode() [测试: A obj1 = new A(); A obj2 = new A(); A obj3 = obj1]
    6)后面在集合中hashCode如果需要的话,也会重写

    toString方法

    基本介绍
    默认返回:全类名+ @ +哈希值的十六进制,[查看Object 的toString方法]
    子类往往重写toString方法,用于返回对象的属性信息

    Object类的toString方法

        public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    
    • 1
    • 2
    • 3

    重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式.

    public class Person {
        private String name;
        private int age;
        private char gender;
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender=" + gender +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    当直接输出一个对象时,toString 方法会被默认的调用

    finalize方法

    1.当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作[演示]
    2.什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用finalize方法。
    3.垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动触发垃圾回收机制,测试: Car [name]

    提示:我们在实际开发中,几乎不会运用finalize ,所以更多就是为了应付面试.

    package src.object_.finalize_;
    
    public class Finalize_ {
        public static void main(String[] args) {
            Car bmw = new Car("宝马");
            bmw = null;  // 变垃圾了, 垃圾回收器就会回收(销毁)对象, 在销毁对象前, 会调用该对象的finalize方法
            // 程序员就可以在finalize中, 写自己的业务逻辑代码(比如释放资源:数据库连接,或者打开的文件流..)|
            System.gc(); // 但是并不是一变成立刻就被干掉了, 可以调用gc主动运行垃圾收器。
        }
    }
    
    class Car {
        private String name;
    
        public Car(String name) {
            this.name = name;
        }
    
        @Override
        protected void finalize() throws Throwable {
            // super.finalize();
            System.out.println("被干掉啦");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    Docker——作为非运维人员,数据卷我们需要了解哪些?
    屏幕分辨率dpi解析(adb 调试查看)
    python制作自己的专属二维码
    ARM-Cortex_M3/M4处理器开发简介
    经典/最新计算机视觉论文及代码推荐
    SYNOPSYS VCS Makefile学习
    抖音矩阵系统源码,抖音矩阵系统定制开发look
    【开源】基于JAVA的音乐偏好度推荐系统
    【是C++,不是C艹】 类与对象 | 认识面向对象 | 访问限定符 | 封装 | this指针
    关于女生学习信息学奥赛
  • 原文地址:https://blog.csdn.net/Drifter_Galaxy/article/details/127822529