目录
  • 1.equals方法
    • ==运算符
    • equals
  • 2.hashCode
    • 3.toString
      • 4.finalize

        1.equals方法

        ==运算符

        比较运算符,即可以判断基本类型又可以判断引用类型

        如果判断基本类型,则判断值是否相等

        如果判断引用类型,则判断地址是否相等,即判断是否为同一个对象

        equals

        是object类的一个方法,只能判断引用类型

        object – equals源码:

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

        可以清晰的看到,object类里的equals方法是判断对象的地址是否相同(是不是同一个对象)

        但是,其他数据类型类会重写equals方法,比如String类的重写:(判断两个字符串的值是否相等)

        public boolean equals(Object anObject) {
            if (this == anObject) {
                return true;
            }
            return (anObject instanceof String aString)
                    && (!COMPACT_STRINGS || this.coder == aString.coder)
                    && StringLatin1.equals(value, aString.value);
        }
        

        实例:

        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println(str1 == str2); // false
        System.out.println(str1.equals(str2)); // true
        

        2.hashCode

        提高具有哈希结构的容器的效率

        两个引用如果指向同一个对象,哈希值肯定(不冲突的情况下)一样,反之不一样

        哈希值根据地址而来但并非地址

        演示:

        // hashCode
        A a = new A();
        A a1 = new A();
        A a2 = a;
        System.out.println(a.hashCode());
        System.out.println(a1.hashCode());
        System.out.println(a2.hashCode());
        ------------------------------
        

        输出:

        1324119927
        990368553
        1324119927

        3.toString

        返回该对象的字符串表示

        源码:

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

        实例:

        // toString
        A a3 = new A("dahe",25,"安全服务工程师");
        System.out.println(a3.toString());
        

        输出:

        classes.A@41629346
        包名.类名@十六进制的hashCode

        现在我们在类中重写一下toString方法(模板):

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

        再次运行上面的代码,现在输出如下:

        A{name='dahe', age=25, job='安全服务工程师'}
        

        另外,当我们直接输出对象时,会默认直接调用toString方法:

        System.out.println(a3);
        

        输出:

        A{name='dahe', age=25, job='安全服务工程师'}

        4.finalize

        当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作

        注意:在JDK18中。finalize被弃用了。它虽然可以帮助我们主动释放系统底层资源,但是说实话,没用过,Java 是自动管理内存的,使用它反而会导致潜在的系统安全风险,没帮助不说反而是负担,所以计划移除了。

        实例:

        // finalize
        A a4 = new A("dh",33,"架构师");
        a4 = null; // 这是a4成为了垃圾,垃圾回收器就会回收对象
        // 在销毁对象之前,会调用对象的finalize方法
        // 程序员就可以在这个方法中写入自己的业务,释放资源
        

        重写finalize方法:

        @Override
        protected void finalize() throws Throwable {
            System.out.println("我们销毁对象");
        }
        

        除此之外,还可以主动运行垃圾回收器:

        System.gc(); // 主动调用垃圾回收器
        声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。