美文网首页程序员
【Java面试提问解读】一:Object类九大方法

【Java面试提问解读】一:Object类九大方法

作者: Cesarean | 来源:发表于2019-03-02 12:24 被阅读42次
    面试公司:字节跳动西瓜视频
    面试岗位:后台开发日常实习生
    面试轮次:第一次面试

    前言:我们知道Object类是所有的Java对象隐式继承的类,而在Object类上有九大方法,这是一个基本需要掌握的知识点。在这个提问点上有多个可衍生的问题


    Object类有哪些方法并分别简单介绍

    • getClass():这是一个final方法,亦即不可重写。其作用是获取对象的运行时Class
    • hashCode():获取对象的哈希值,一般情况下是根据对象的地址或者字符串或者数字计算。
    • equals():判断两个对象是否相等。
    • clone():这是一个protected方法。实现对象的浅复制,只有当对象实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
    • toString():返回一个能够表示该对象的字符串,一般来说该字符串应该是简明而有意义的,且尽量所有的子类都应该重写该方法。
    • notify():唤醒在该对象上等待的某个线程,如果有多个线程在该对象上等待,那么按照一定的算法唤醒其中一个。
    • notifyAll():唤醒在该对象上等待的所有线程
    • wait():使当前线程在该对象上等待。
    • finalize():这是一个protected方法。当对象被释放时,该方法则会被调用进而程序员可通过该方法释放JVM无法管理的内存以避免内存泄漏。

    比较hashCode()equals()==

    • 首先比较equals()==
        简单来说,==是值的比较,而equals()是对象的比较。我们知道Java的两大类型分别是原始型和引用型,不管原始型还是引用型都有基本的值,原始型的值就是本身的变量值,而引用型的值是指向堆中某个对象的引用。==就是比较这个基本的值,而equals()方法则是对对象进行比较,这样也就是两个引用型指向的对象之间的比较。
        也就是说,==true的是同一个对象,其equals()一定为true;而equals()true的是逻辑上相等的对象,可能是同一个也可能不是。
        然而,参考之下equals()Object类的实现,Java默认equals()是通过==进行的,也就是说,只有当我们重写该方法后,一般才是通过对象来判断相等。
    public boolean equals(Object obj) {
        return (this == obj);
    }
    
    • 然后比较hashCode()equals()
        首先最重要的是hashCode()相等并不表示对象相等,equals()true则对象一定相等,且Java要求此时的计算出的hashCode()必须一致。
        我们之前提到hashCode()是对于对象的哈希值的计算,联想数据结构时对哈希表的了解,没有某个算法能对每个不同的对象计算出不同的哈希值,所以存在不同的对象哈希值相等的可能性,而equals()的实现就是我们对对象相等的逻辑判断,但往往equals()hashCode()效率低。
        所以实际上的判断对象是否相等是先判断hashCode()是否相等,如果不相等则对象肯定不相等,如果相等则继续调用equals()判断对象是否相等。

    详述wait()notify()作用

    该问题如有操作系统原理相关的知识在理解上会更好(以下尚未深入到应用层)

    • 根据个人理解,wait()notify()非常类似于信号量原语,将对象视为信号量,将在对象上等待的线程数量视为信号量的值。
    • 首先wait()会使当前线程在该对象上进入阻塞,其重载方法可设置超时间隔,可以有多个线程在该对象上等待。其进入调度的情况有notify()notifyAll()和超时(不考虑InterruptedException)。
    • 然后notify()可以使当前线程上的某一个线程进入调度。该线程的选择决定于具体的调度方案,几乎相当于随机,不可对线程的选择做预先的猜测判断;而notifyAll()则是使当前对象的所有线程进入调度。

    详述finalize()作用

    • Java的GC只负责对象内存相关的清理,所有其他资源的清理必须由程序员手动编写,否则可能导致内存泄漏,因此某些对象会有close()方法。
    • finalize()是确定的当对象被GC回收时必然调用的方法,假设有资源持续在整个对象的生命周期里,可以将额外的资源在finalize()里进行回收
    • finalize()可以被用户自己调用,但这种调用不会导致对象被销毁
    • GC时,finalize()里抛出的异常,如未被捕获处理,只会导致该对象的finalize()执行退出,而不会导致GC终止。

    结语:这一部分面试的时候我虽然曾经学习而且理解过,但几乎全忘了,因为课程项目基本不会涉及到上述的大部分方法。但又确确实实在实际工作中很有用,而且属于个人的硬实力,所以基本上还是会作为面试的主要考核内容,作此记录,以便之后复习。
    如有错误,还请各位在下指出,以便不误导。

    相关文章

      网友评论

        本文标题:【Java面试提问解读】一:Object类九大方法

        本文链接:https://www.haomeiwen.com/subject/hezsuqtx.html