1、“==”
“==”运算符用来比较两个变量的值是否相等。具体情况如下:
(1)如果两个变量是基本数据类型,可以直接使用“==”运算符来比较其对应的值是否相等。
(2)如果一个变量指向的数据是对象(引用类型),此时就会涉及到两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,变量所对应内存存储的数值就是对象占用的那块内存的首地址。如果要比较两个变量是否指向同一个对象,就可以用“==”来判断。但是如果要比较两个变量所指向对象的内容是否相等,“==”就无能为力了。
2、equals()
equals()是Object类提供的方法之一。每一个Java类都继承Object类,所以每个对象都具有equals()方法。Object类中定义的equals(Object)方法是直接使用“==”运算符比较两个对象,所以在没有覆盖equals(Object)方法的情况下,equals(Object)与“==”运算符一样,比较的是引用。
相比“==”,equals(Object)方法的特殊之处就在于它可以被覆盖,所以可以通过覆盖的方法让它比较数据内容而不是比较引用。
3、hashCode()
hashCode()方法是从Object类中继承过来的,它也用来鉴定两个对象是否相等。Object类中的hashCode()方法返回对象在内存中地址转换成的一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()方法返回值都是不相等的。
一般在覆盖equals()方法的同时也要覆盖hashCode()方法,否则,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类(HashMap、HashSet和Hashtable)结合在一起正常运行。
hashCode()方法返回值和equals()方法的关系如下:
(1)如果x.equals(y)返回true,即两个对象根据euqals()方法比较是相等的,那么x和y两个对象的hashCode()返回值也是相等的。
(2)x.equals(y)返回false,那么x和y两个对象的hashCode()返回值可能是相等的,也可能不相等。
(3)如果x和y两个对象的hashCode()返回值不相等,一定能推出x.equals(y)返回false。
(4)如果x和y两个对象的hashCode()返回值相等,x.equals(y)可能返回false,也可能返回true。