1. "=="分为两种情况:
(1) 基本数据类型,比较的是其对应的值是否相等;
(2) 引用类型,比较的是他们在内存中存放的地址(或者说,是否指向同意对象)。
2. equals:
是Object类提供的方法之一,在Object类中的定义就是直接使用"=="进行比较,所以在没有覆盖equals()方法的情况下,equals()与"=="是一样的。
boolean equals(Object o){ return this = o; }
相比于"==",equals()方法是可以被覆盖的。比如,在一些类库(String,Integer,Date等)中,equals()方法比较的是对象的内容是否相同。如果希望编写的类可以比较该类创建的两个实例对象的内容是否相等是,那么必须要覆盖equals()方法。
3. hashCode:
hashCode()方法是从Object类中继承过来的,也是用来鉴定两个对象是否相等,返回的是对象在内存中地址转换成的一个int值。所以,如果没有重写hashCode()方法,任何对像的hashCode()方法都不是相等的。
hashCode()与equals()的区别:equals()方法是给用户调用的;对于hashCode()方法,用户一般不会去调用它。两者的不同之处在于,hashCode()返回的是int型,比较起来不直观。
一般在覆盖equals()的同时也要覆盖hashCode()。hashCode()的返回值与equals()的关系如下:
(1) 如果x.equals(y)返回true,那么调用这两个对象中任意一个对象的hashCode()方法都必须产生同样的整数结果。
(2) 如果x.equals(y)返回false,那么x和y的hashCode()方法的返回值可能相等,也可能不等。
(3) 如果hashCode()方法的返回值不相等,一定能推出来equals()方法的返回值也不相等。