面试公司:字节跳动西瓜视频
面试岗位:后台开发日常实习生
面试轮次:第一次面试
前言:我们知道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终止。
结语:这一部分面试的时候我虽然曾经学习而且理解过,但几乎全忘了,因为课程项目基本不会涉及到上述的大部分方法。但又确确实实在实际工作中很有用,而且属于个人的硬实力,所以基本上还是会作为面试的主要考核内容,作此记录,以便之后复习。
如有错误,还请各位在下指出,以便不误导。
网友评论