Object类
# Object类
# 介绍
java.lang.Object
类是 Java 语言中的根类,即所有类的父类。它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是 Object。
如果一个类没有特别指定父类, 那么默认则继承自 Object 类。
# 类中的方法
// 本地方法,它在Java虚拟机中注册了一些与底层操作系统相关的本地方法。例如,对象的创建、销毁、内存管理等。
private static native void registerNatives();
static {
registerNatives();
}
// native⽅法,⽤于返回当前运⾏时对象的Class对象,使⽤了final关键字修饰,故不允许⼦类重写。
public final native Class<?> getClass()
// native⽅法,⽤于返回对象的哈希码,主要使⽤在哈希表中,⽐如JDK中的HashMap。
public native int hashCode()
// ⽤于⽐较2个对象的内存地址是否相等,String类对该⽅法进⾏了重写⽤户⽐较字符串的值是否相等。
public boolean equals(Object obj)
// naitive⽅法,⽤于创建并返回当前对象的⼀份拷⻉。⼀般情况下,对于任何对象 x,表达式 x.clone() != x 为true,x.clone().getClass() == x.getClass() 为true。
// Object本身没有实现Cloneable接⼝,所以不重写clone⽅法并且进⾏调⽤的话会发⽣CloneNotSupportedException异常。
protected native Object clone() throws CloneNotSupportedException
// 返回类的名字@实例的哈希码的16进制的字符串。建议Object所有的⼦类都重写这个⽅法。
public String toString()
// native⽅法,并且不能重写。唤醒⼀个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒⼀个。
public final native void notify()
// native⽅法,并且不能重写。跟notify⼀样,唯⼀的区别就是会唤醒在此对象监视器上等待的所有线程,⽽不是⼀个线程。
public final native void notifyAll()
// native⽅法,并且不能重写。暂停线程的执⾏。注意:sleep⽅法没有释放锁,⽽wait⽅法释放了锁 。timeout是等待时间。
public final native void wait(long timeout) throws InterruptedException
// 多了nanos参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。 所以超时的时间还需要加上nanos毫秒。
public final void wait(long timeout, int nanos) throws InterruptedException
// 跟之前的2个wait⽅法⼀样,只不过该⽅法⼀直等待,没有超时时间这个概念
public final void wait() throws InterruptedException
// 实例被垃圾回收器回收的时候触发的操作
protected void finalize() throws Throwable { }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 使用hashcode的原因
hashcode()
是 Object 的方法,主要是为了在 HashMap 中存储使用,HashMap 查找速度快,根据 key 的 hashcode 值生成数组下标,时间复杂度为 O(1)。
在哈希表中查找元素时,首先会比较两个元素的哈希值是否相等,如果相等的话再用equals()
进行比较。
在 JDK 中,Object 的 hashcode 方法是本地方法,也就是用 c/c++ 实现的,直接返回对象的内存地址,所以重写 hashcode 方法是十分重要的。
在 String 中,计算方法为:val[0]*31^(n-1) + val[1]*31^(n-2) + ... + val[n-1]
,字符串一样的 String 对象 hashcode 也一样。
使用31的原因?
- 31是不大不小的质数,选择质数是为了降低哈希算法的哈希冲突。
- 31可被JVM优化:
31 * i = (i << 5) - i
编辑 (opens new window)
上次更新: 2024/04/17, 21:30:18