object类方法
1.getClass方法
获取运行时类型,返回值为Class对象
2.hashCode方法
返回当前对象的哈希码值
3.equals方法
判断两个对象是否相等,默认用的==判断地址。所以一般会对equals方法进行重写,重写成判断值
4.clone方法
拷贝对象,分深拷贝和浅拷贝
深拷贝拷贝实际的数据
浅拷贝仅拷贝引用
5.toString方法
返回一个String字符串,用于描述当前对象的信息,默认返回的是当前对象的类名+hashCode的16进制数字。一般重写成对自己有用的信息。
6.wait方法
睡眠同时释放锁
7.notify方法
唤醒在该对象阻塞队列上等待的某个线程
8.notifyAll方法
唤醒在该对象阻塞队列上等待的所有线程
9.finalize
对象在被GC释放之前会调用且只能调用一次finalize方法,成功调用则不会被回收。
没有特殊原因的话不要重载finazlie()方法,原因有两点:
- 会影响JVM的对象分配与回收速度
- 对象的再次“复活”破坏了Java对象的生命周期进程
equals
= =和equals的区别:
-
==
判断两个对象的地址
-
equals()
如果没重写,默认调用==
一般重写成判断两个对象的数值
是否相等
hashCode
hashCode() 的作用就是获取哈希码,这个哈希码的作用是确定该对象在哈希表中的索引位置
。
为何重写equals()方法时必须同时重写hashCode方法?
因为判断是否相等的顺序是:hashcode——equals
如果不重写hashcode,则可能存在两个相同的对象,计算的hashcode值不同,而被重复放入hashMap中导致出错,重写hashcode保证equals方法返回true的两个对象,hashcode值一定相同,就可以避免出错了。
为什么不直接equals判断,非要在前面加一个hashcode计算呢?
因为计算hashcode比equals方法的开销要小,,如果hashCode不相等,就不用再调用equals进行比较,以达到节约性能开销的目的。
那为什么相同对象的hashcode不同呢?
hashcode方法默认实现是根据对象的存储地址
形成一个哈希值
,两个值相同的对象,他们的存储地址不同,所以计算的hash值就不同.
怎么重写hashcode?
利用对象的实际数值而不是存储地址来计算hashCode,那么数值相同的两个对象的hashCode就一定相同了。