【Java易混淆知识点】hashCode,equals,== 三者的区别是什么?

对于我们时常混淆的三个比较大小的方式:

1.“ == ”运算符

“==”运算符用来比较两个变量的值是否相等。换而言之,该运算符用于比较变量对应的内存中所存储的数值是否相同,要比较两个基本数据类型或者两个引用变量是否相等(指向同一个对象)只能使用 “ == ”运算符。
具体解释:
如果两个变量是基本数据类型比如"int""float"等类型,可以直接使用 “= =”运算符;
如果一个引用变量指向的数据是对象,那么此时就设计到两块内存,引用变量占用一块空间,对象也占用一块空间。而引用变量内存中存储的数值就是其所指向的对象占用内存的首地址。对于指向对象类型的引用变量,使用 “= =”运算符就比较的是两个引用变量占用内存是否一致,即是否是指向同一个对象。但无法实现比较两个对象中存储的值。

2.equals()

equals是Object 类中提供的方法之一。每一个Java类都继承自Object类,因此,每个对象都具有equals这个方法。Object类中定义的equals方法是直接使用"= = "运算符来比较两个对象的,所以子类在没有覆盖Object类中的equals方法的情况下,与“==”运算符效果一致。
在创建类是,一般要求覆写equals方法,可用通过覆写方法使得比较的是对象的数据内容而不是引用的值。String类中就实现了equals方法用于比较两个独立对象中存放的内容是否相同。
例如:

String s1 = new String("Hello");
String s2 = new String("Hello");

此时,判断 s1 == s2 将返回false,因为s1和s2是开辟了两个不同的存储空间,指向的并不是一个对象;
同样,判断 s1.equals(s2) 就将返回true,因为两个对象存放的内容是相同的。

3.hashCode()

hashCode()方法是从Object类中继承而来的,它也是用来鉴定两个对象是否相等。在Object类中的hashCode方法会返回对象在内存中地址转换而来的一个int值,如果没有覆写hashCode()方法,任何两个对象的hashCode方法都是不相等的。
hashCode()一般使用于创建hash表的哈希值时来覆写方法,生成key值。一般在覆盖equals方法时也要同时覆盖hashCode方法。
hashCode方法和equals方法的返回值的关系如下:
如果两个变量调用equals方法返回为真,那么同样两个变量调用hashCode方法返回值一定相同
如果两个对象调用equals方法返回值为假,那么两个变量的hashCode方法返回值可能为真也可能为假
如果两个变量的hashCode方法返回值相等,那么这两个变量调用equals方法返回值可能为真也可能为假
如果两个变量的hashCode方法返回值不相等,那么着两个变量调用equals方法返回值一定为假

发布了62 篇原创文章 · 获赞 28 · 访问量 6075

猜你喜欢

转载自blog.csdn.net/Moo_Lavender/article/details/102764770