equals()
作用:用于比较两个对象是否相等。默认实现比较对象的内存地址,即判断两个引用是否指向同一个对象
使用:通常会重写此方法来比较对象的内容
hashCode()
作用:返回对象的哈希值,用整数表示对象。
使用:如果重写了equals()方法,则通常也需要重写hashCode()方法,以保证相等的对象具有相同的哈希值
hashCode()默认实现是基于对象的内存地址生成哈希值,如果两个不同的对象,通过equals比较发现内容完全一样,可是内存地址不同,那么他们的哈希值也不同,这不符合"逻辑原则"
逻辑原则:
- 如果对象的
equals()
方法返回true
,那么这两个对象的hashCode()
方法必须返回相同的值 - 如果两个对象的
equals()
方法返回false
,则它们的hashCode()
不必不同,但最好尽量不同,以提高性能 hashCode()
方法应一致性:在对象的生命周期内,如果对象的某些信息没有改变,则多次调用该对象的hashCode()
方法应该返回相同的结果。
下面的例子中,将内存地址生成哈希值,改成用内容生成哈希值,然后equals比较也从比较内存地址,改成比较内容,所以这俩一般会一起重写
public class ObjectTest {String name;int age;public ObjectTest(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true; // 同一引用返回trueif (obj == null || this.getClass() != obj.getClass()) return false; // 空引用或者类型不匹配返回falseObjectTest objectTest = (ObjectTest) obj;return this.age == objectTest.age && Objects.equals(this.name, objectTest.name);}@Overridepublic int hashCode() {return Objects.hash(name, age); // 使用 Objects 工具类生成哈希码}public static void main(String[] args) {ObjectTest p1 = new ObjectTest("黄小桃", 18);ObjectTest p2 = new ObjectTest("王心妍", 20);ObjectTest p3 = new ObjectTest("黄小桃", 18);System.out.println(p1.equals(p2));System.out.println(p1.equals(p3));System.out.println(p1.hashCode());System.out.println(p2.hashCode());System.out.println(p3.hashCode());System.out.println(p1.hashCode() == p2.hashCode());System.out.println(p1.hashCode() == p3.hashCode());}
}
toString()
作用:用字符串表示对象。默认实现是返回对象的全限定类名加上哈希值的十六进制表示
使用:用来更清楚的描述对象
getClass()
作用:返回对象的运行时类(Class对象)。此方法是Object类中的final方法,不能被重写
使用:可以用来获取对象的类信息,常用于反射操作
notify()
作用:唤醒一个处于等待状态的线程。需要在同步代码块或者同步方法中调用
使用:用于在多线程环境中的线程通信
notifyAll()
作用:唤醒其他处于等待状态的所有线程。需要在同步代码块或通过方法调用
使用:用于处理多线程之间的通信协作
wait()
作用:使线程处于无限等待状态,直到其他线程调用notify()或者notifyAll()方法唤醒。需要在同步代码块或通过方法调用
使用:用于线程间的通信,线程会等待直到被唤醒或超时
wait(long timeout,int nanos)
作用:使线程处于计时等待状态(休眠状态),直到指定的时间到期或被唤醒
使用:用于实现更精细的等待控制,允许指定等待时间,甚至精确到纳秒
clone()
作用:创建并返回当前对象的一个副本。默认实现是进行浅拷贝
使用:通常会重写此方法实现深拷贝,以确保克隆对象的完整性
finalize()
作用:在垃圾回收器确定不存在对该对象的更多引用时调用,用于进行资源释放等清理工作
使用:不建议使用,因为它依赖于垃圾回收器的实现,可能会导致不确定的性能问题。推荐使用try-with-resources和AutoCloseable接口进行资源管理