Object类是所有类的父类,任何类都默认继承Object,位于java.lang包中,Object类主要实现了哪些方法呢?
toString方法
toString方法可以将任何一个对象转换成字符串返回,返回值的生成算法为:getClass().getName() + '@' + Integer.toHexString(hashCode())。不过,一般子类都会重写该方法。
equals方法
Object类中的equals方法,用来比较两个引用的虚地址。当且仅当两个引用在物理上是同一个对象时,返回值为true,否则将返回false。不过,一般子类都会重写该方法。
hashCode方法
获取对象的哈希码值,为16进制。
clone方法
保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
getClass方法
final方法,获取类的class对象。
wait方法
导致线程进入等待状态,直到它被其他线程通过notify()或者notifyAll唤醒。该方法只能在同步方法中调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。wait(long timeout)可以设定一个超时间隔,调用该方法后当前线程进入睡眠状态,直到以下事件发生:
(1)其他线程调用了该对象的notify方法。
(2)其他线程调用了该对象的notifyAll方法。
(3)其他线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
notify方法
该方法唤醒在该对象上等待的某个线程。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
notifyAll方法
解除所有那些在该对象上调用wait方法的线程的阻塞状态。该方法只能在同步方法或同步块内部调用。如果当前线程不是锁的持有者,该方法抛出一个IllegalMonitorStateException异常。
为什么重写equals方法必须重写hashcode方法
因为如果只重写了equals方法而没有重写hashCode方法,则两个不同的实例a和b虽然equals结果相等(业务逻辑上,比如:两个对象的值全部相等),但却会有不同的hashcode,这样hashmap里面会同时存在a和b,而实际上我们需要hashmap里面只能保存其中一个,因为从业务逻辑方向看它们是相等的。
equals方法和hashCode方法如果不同时按你自己逻辑重写的话,HashMap就会出问题。比如你只重写了equals方法而没有重写hashCode方法,那么HashMap在第一步寻找链表的时候会出错,有同样值的两个对象a和b并不会指向同一个链表或桶,因为你没有提供自己的hashCode方法,那么就会使用Object的hashCode方法,该方法是根据内存地址来比较两个对象是否一致,由于a和b有不同的内存地址,所以会指向不同的链表,这样HashMap会认为b不存在,虽然我们期望a和b是同一个对象;反之如果只重写了hashCode方法而没有覆盖equals方法,那么虽然第一步操作会使a和b找到同一个链表,但是由于equals没有覆盖,那么在遍历链表的元素时,a.equals(b)也不为true(事实上Object的equals方法也是比较内存地址),从而HashMap认为不存在b对象,这同样也是不正确的。
wait、notify方法使用场景
在某些情况下,线程需要交替执行。比如一个线程向一个存储单元执行存放数据,而另一个操作执行取值操作,线程间同步完成这个存取任务,需要将这些线程同步。要解决线程交替执行但是又要保证共享资源安全,这需要使用到wait()、notify()方法。
————————————————
版权声明:本文为CSDN博主「学、渣」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_19801061/article/details/120994530