== 与 equals?hashCode 与 equals ?

【CSDN】== 和 equals 的区别

== :
==是操作符

基本类型:比较值是否相等 (byte,short,char,int,long,float,double,boolean)

引用类型:比较堆内存地址是否相等 (new一个引用类型的对象,会重新分配堆内存空间,使用==比较返回false)

补充:==运行速度比equals()快,因为==只是比较引用

equals:  
equals()是Object类的一个方法,Java当中所有的类都是继承于Object这个超类。

引用类型:默认情况下,比较内存地址值是否相等
一般重写都是自动生成,比较对象的成员变量值是否相同   

hashCode 与 equals ?

【CSDN】java基础:hashCode() equals()总结

equals()性质:

  1. 自反性(reflexive)。对于任意不为null的引用值x,x.equals(x)一定是true。
  2. 对称性(symmetric)。对于任意不为null的引用值x和y,当且仅当x.equals(y)是true时,y.equals(x)也是true。
  3. 传递性(transitive)。对于任意不为null的引用值x、y和z,如果x.equals(y)是true,同时y.equals(z)是true,那么x.equals(z)一定是true。
  4. 一致性(consistent)。对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false。
  5. 非空性。对于任意不为null的引用值x,x.equals(null)返回false。

需要注意的是当equals()方法被override时,hashCode()也要被override。按照一般hashCode()方法的实现来说,相等的对象,它们的hash code一定相等。

hashCode()方法

hashCode()方法给对象返回一个hash code值。

  1. hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
  2. 如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
  3. 如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
  4. 两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”

补充: 为什么要有hashCode?