1、“==”是运算符:比较变量对应的内存中所存储的数值是否相同。要比较两个基本数据类型数据或两个引用变量是否相等,只能使用“==”运算符。
“==”比较两个引用类型变量,比较的是两个对象是否指向同一个对象,如果要看这两个变量所对应内存中的数值(内容)是否相等,则无法用“==”实现。
2、equals是Object类提供的方法之一,每个对象都具有equals这个方法,在没有覆盖equals(Object)方法的情况下,equals(Object)与“==”运算符一样,比较的是引用。
equals和“==”不同:equals(Object)可以被覆盖,可通过覆盖的方法让它不是比较引用,而是数据的内容。
3、hashCode()方法是从Object类中继承过来的,也是用来鉴定两个对象是否相等。Object类中的hashCode()方法返回对象在内存中地址转换成一个int值,所以如果没有重写hashCode()方法,任何对象的hashCode()都是不相等的。
equals和hashCode()的不同:
(1)equals()是给用户调用的,如果判断两个对象是否相等,可以重写equals()方法,然后在代码中调用。对于hashCode()方法一般不会去调用它,hashCode()相当于一个对象的编码。
(2)返回类型不同:hashCode()返回类型int型,equals()返回类型boolean型。
(3)一般在覆盖equals()方法的同时也要覆盖hashCode()方法。
(4)用这两种方法比较两个变量,equals()比较不相等,则hashCode()返回值可能相等,也有可能不等;
反之,hashCode()返回值不等,一定能推出equals()比较也不相等;hashCode()返回值相等,equals()比较可能相等,也有可能不相等。