文章目录
1. public final native Class<?> getClass()2. public native int hashCode()3. public boolean equals(Object obj)4. protected native Object clone() throws CloneNotSupportedException5. public String toString()6. public final native void notify()7. public final native void notifyAll()8. public final native void wait(long timeout) throws InterruptedException9. public final void wait(long timeout, int nanos) throws InterruptedException10. public final void wait() throws InterruptedException11. protected void finalize() throws Throwable()一些延伸的问题
文章参考于
【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识重写equal()时为什么也得重写hashCode()之深度解读equal方法与hashCode方法渊源Java中sleep()与wait()区别 首先说明两点
Object 是一个特殊的类,是所有类的父类;它提供了11个方法native(本地的)方法:一个java调用 非java 代码的接口,也就是该方法的实现并不是java代码实现的,比如使用c或者c++实现的。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。(附一链接: JAVA中的native是什么?)
1. public final native Class<?> getClass()
navtive方法,用于返回当前运行时对象的Class对下你给,使用了 final 关键字修饰,所以不允许子类重写
2. public native int hashCode()
native方法,用于返回对象的哈希吗,主要使用在哈希表中,比如jdk中的 HashMap
3. public boolean equals(Object obj)
用于比较两个对象的内训地址是否相等,String 类对该方法进行了重写用于比较字符串的值是否相等有以下5个规则
自反性。对于任何非 null 的引用值 x,x.equals(x) 应该返回 true对称性。对于任何非 null 引用值 x 和 y ,当且仅当: y.equals(x) 返回 true时,x.equals(y)才返回 true传递性。对于任何非 null 引用值 x y 和 z,如果 y.equals(x)返回 true,y.equals(z)返回 true,那么 x.equals(z)也应该返回true一致性。对于任何非 null 引用值 x 和 y,假设对象上 equals 比较中的信息没有被修改,则多次调用 x.equals(y) 始终返回 true 或者 始终返回false对于任何非 null 引用值x,x.equals(null) 用返回 false
4. protected native Object clone() throws CloneNotSupportedException
native 方法,用于创建并返回当前对象的一份拷贝。
x.clone() != x //true
x.clone().getClass() == x.getClass() //true
Object 本身是没有实现Cloneable接口的,所以不重写 0.clone方法并且进行调用的话会发生CloneNotSupportedException异常。
5. public String toString()
返回对象的字符串表示形式。实际上是该符号字符的 ‘类名称的字符串@’ 和 对象的哈希吗的无符号16进制的表示。换句话说就是返回了下列值的字符串:getClass().getName() + “@” + Integer.toHesString(hashCode)建议 Object 所有子类都重写这个方法
6. public final native void notify()
native方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)如果有多个线程在等待只会唤醒一个。
7. public final native void notifyAll()
native方法,并且不能重写。作用跟 notify() 一样,只不过会唤醒在此对象监视器上等待的所有线程,而不是一个线程。
8. public final native void wait(long timeout) throws InterruptedException
native 方法,并且不能重写。作用是:暂停线程的执行。注意:sleep() 方法没有释放锁,wait释放了锁。timeout 是等待时间。
9. public final void wait(long timeout, int nanos) throws InterruptedException
比上者多了 nanos参数,表示额外的时间(以毫秒为单位,范围是 0 - 999999)。
10. public final void wait() throws InterruptedException
跟上面两个一样,只不过该方法会一直等下去,没有超时这个概念
11. protected void finalize() throws Throwable()
实例被垃圾回收器回收的时候出发的操作
一些延伸的问题
为什么重写 equals 时必须重写 hashCode方法?
数据机构中有一个Map接口的类会使用到键对象的哈希码,在我们调用 put() 或者 get() 方法对 Map 容器进行操作时,是根据键对象的哈希码来计算存储位置的,因此如果我们对哈希码的获取没有相关保证,就可能得不到预期的结果。在java中,我们可以使用 hashCode() 来获取对象的哈希码,其值就是对象的存储地址。(hashCode()的值是通过Object对象的地址计算得出的)因为Object对象只与自身相等,所以同一个对象的地址总是相等的,计算得出的哈希码也必然相等们对于不同的独享,由于地址不用,所获取的哈希码自然也不会相等。
equals() 与 == 的区别
默认情况下,都是从Object 继承而来的 equals() 与 == 是完全等价的,比较都是对象的内存地址,但我们可以重写 equals(),使其按照我们需求的方式进行比较,如 String 类重写了 equals() ,使其比较的是字符的序列,而不是内存地址。
sleep() 和 wait() 的区别
sleep():可以使正在执行的线程让出 cpu,然后cpu就可以去执行其他任务了,在sleep指定的时间结束后cpu会再次回到该线程继续往下执行(sleep只是让出了cpu,并不会释放同步资源锁);sleep()属于线程类(Thread)方法,可以在任何地方使用。wait():是当前线程让出同步资源锁,以便其他正在等待该资源的线程得到该资源而运行(进入了等待队列),只有调用了notify()方法,之前调用 wait() 的线程才会解除 wait 状态,重新获得 去竞争同步资源的资格,得到资源后,方可执行;wait() 属于 Object 方法,只能在同步方法或同步块中使用。