一、Object
1.常用方法:
- Class<?> getClass():返回对象运行时类;
- boolean equals(Object obj):判断指定对象与该对象是否相等;
- int hashCode(): 默认返回该对象的地址值。但大多情况hashCode()被重写。
- String toString():返回对象的字符串表示。如打印和字符串连接操作,系统都会自动调用toString()方法。
- wait(), notify(), notifyAll():控制线程的暂停和运行。
- clone: 得到当前对象的副本,且二者完全隔离,运用protected修饰,故只能被子类重写或调用。
- finalize(), 清理对象资源,垃圾回收器最多调用它的finalize()方法一次,从JDK9开始,这个方法标记为不推荐使用。
2.hashCode()和equals()的关系
hashCode()用于获取对象的哈希码(散列码),equals()用于比较两个对象是否相等:
- 如果两个对象相等,那么他们有相同的哈希码;
- 如果两个对象有相同的哈希码,那他们未必相等。
3.HashSet
在JAVA中,set代表无序、元素不可重复的集合,HashSet是Set接口的典型实现。
当HashSet中要加入一个元素时,他通过获取元素的哈希码和调用equals()方法来判断该元素是否存在,避免重复存储。
- HashSet首先会调用hashCode()方法获取元素的哈希值,确定该元素的存放位置;
- 若此位置是空的,则直接存储;若不为空,那么调用equals()方法看二者是否相等,若相等,则不会保存这个元素;若不相等,此时HashSet会采用链表结构在同一位置保存多个对象,即将新加的对象链接到原来对象之后。之后,再由新对象也映射到这个位置时,就需要与这个位置中所有的对象进行equals()比较,若均不相等则将其链接到最后一个对象之后。
4.重写hashCode()和equals()方法的原因
- Object类提供的equals()方法默认是用==来进行比较的,只有两个对象是同一个对象,才会返回相等。但是在实际开发中,我们通常只要比较内容是否相等,就算是不同的对象只要内容相同就返回相等,那么显然提供的equals()方法是没有实用价值的,通常需要重写。
- 根据hashCode()和equals()的关系:如果两对象相等,则它们必须有相同的哈希码。所以hashCode()和equals()方法具有联动关系,那么equals()方法重写时,通常也要将hashCode()方法重写。
5.==和equals()的区别
==运算符:
- 作用于基本数据类型时,比较两个数值是否相等;
- 作用于引用类型时,比较两个对象的内存地址是否相等,即是否为同一个对象。
equals()方法:
- 没有被重写时,用==实现;
- 被重写是,通常按照对象内容进行比较,若两个对象内容相等则认为相同,否则认为对象不相等。