目录
3.重写equals()方法为什么要重写hashCode()方法
1.equals()和==的联系与区别
联系:==和equals()方法都是用来判断是否相等的
区别:
- ==运算符:
- 对于基本数据类型,只能用==判断其值是否相等
- 对于引用数据类型,==判断的是变量所指向的地址(即内存地址)是否相等
- equals()方法:
- 是Object类的一个方法,用于比较两个对象的内容是否相等
- equals()只能在引用数据类型当中使用,而引用数据类型当中使用的是Object类当中的equals()方法还是用==比较变量指向的地址是否相等
如下代码所示:
a.equals(b)和a==b都可以用来判断a和b的值是否相等;
public class Test {
public static void main(String[] args) {
String a="123";
String b="123";
// == 判断是否相等
// equlas()方法也是用来判断是否相等
a.equals(b);
System.out.println(a==b);
}
}
== :基本数据类型只能用==判断其值是否相等,如a==b;而引用数据类型用==判断的是变量所指向的地址是否相等,它们都new创建了对象,即在堆内存开辟了新的内存空间,所以返回false。
String a="123";
String b="123";
if(a == b){
}
Cat cat=new Cat();
Cat cat1=new Cat();
System.out.println(cat==cat1);
equals():只能在引用数据类型当中使用,在Object类当中的equals()方法还是使用的==比较变量指向的地址是否相等,所以返回false。
Cat cat1=new Cat();
Cat cat2=new Cat();
System.out.println(cat2.equals(cat1)));
2.hashCode()方法
hashCode()方法本身其实是一个native方法,它使用c++实现;它将我们的对象地址映射为一个int类型的数据,这样一来我们的对象就能存储进hash表当中去,同时可以从hash表当中快速定位和查询对象。
hashCode()方法的作用:
- 快速定位对象:hashCode()方法生成的哈希码在哈希表等数据结构中起到了关键作用。哈希表通过哈希码来确定对象的存储位置,从而实现快速查找和检索。当在集合中添加或查找对象时,系统会首先调用对象的hashCode()方法来获取其哈希码值,然后根据这个哈希码值将对象存储到相应的索引位置或进行快速查找。这样可以显著提高查找和插入操作的效率,避免了逐个比较所有属性的开销。
- 作为对象的特征标识符:每个对象都有一个与之关联的哈希码,这个哈希码可以作为对象的一种特征标识符。虽然不同的对象可能会产生相同的哈希码(即哈希冲突),但在大多数情况下,哈希码能够帮助我们区分不同的对象。
- 支持基于哈希的集合:hashCode()方法是基于哈希的集合(如HashSet、HashMap以及HashTable)正常运行的必要条件。这些集合通过哈希码来确定元素的存储位置,从而实现高效的元素存储和检索。
- 与
equals()
方法的关系:hashCode()方法与equals()方法在Java集合框架中有着密切的关系。如果两个对象通过equals()方法判断相等,则它们的hashCode()返回值也必须相同。这种一致性确保了哈希表能够正确地处理重复元素,避免出现错误的插入和删除操作。同时,为了提高哈希表的查找效率,hashCode()方法应尽量使得不同的对象拥有不同的哈希值。 - 重写约定:在Java应用程序执行期间,同一对象上多次调用hashCode()方法时,必须一致地返回相同的整数,前提是对象上的equals比较中所用的信息没有被修改。这是为了确保哈希表的正确性和稳定性。
综上所述,hashCode()方法在Java中扮演着重要的角色,特别是在处理集合和需要高效检索数据的数据结构时。它的实现和使用直接影响到程序的性能和正确性。因此,在重写hashCode()方法时,需要谨慎考虑其实现逻辑和一致性要求。
3.重写equals()方法为什么要重写hashCode()方法
因为我们使用hashCode()方法的时候是在hash表当中进行定位和查询对象的,如果重写了equals()方法,改变了原来判断对象是否相等的逻辑,那么就会导致hashCode()判断相同的对象,equals()判断不相等,或者hashCode()判断不同的对象,equals()判断相等,从而产生bug。
之所以子类重写equals()方法的时候,一定要重写hashCode()方法就是要保证hashCode()计算相同的对象,equals()也能计算相同。