equals、==、hashCode的区别

equals介绍:

equals方法在非空对象引用上实现相等关系

特点:

* 自反性:对于任何非空引用值x,x.equals(x)都返回true

* 对称性:对于任何非空引用值a、b,当且仅当a.equals(b)返回true时,b.equals(a)返回true

* 传递性:对于任何非空引用值x、y、z,当x.equals(y)返回true,并且y.equals(z)返回true时,则x.equals(z)返回true

* 一致性:对于任意非空引用值x、y,多次调用x.equals(y),其结果不变,前提是对象在上equals比较中用到的信息没有被修改

* 对于任意非空引用值x,x.equals(null)返回false

以上五点是重写equals方法时必须遵守的准则

equalsd的作用:

用来判断两个对象是否相等

equals()定义在JDK的Object.java中,通过判断两个对象的地址是否相等来区分它们是否相等

下面根据“类是否覆盖equals()方法”,将它分为2类。

(01) 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。

(02) 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

由上边分类引出equals和==的区别

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不试同一个对象。

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况

情况1:

类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象

情况2:

类覆盖了equals()方法。一般,我们都覆盖equals()方法来判断两个对象的内容是否相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。

hashCode的作用:

hashCode()的作用是获取哈希码,也成为散列码;它返回一个int整数,这个哈希码(散列码)的作用是确定该对象在哈希表中的索引位置

hashCode()定义在JDK的Object.java中,这就意味着java中的任何类都包含hashCode()函数,

虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建“类的散列表”时,该类的hashCode() 才有用,作用是:确定该类的每一个对象在散列表中的位置;

其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等)类的hashCode() 没有作用。

散列表:

java集合中本质是散列表的类如:HashMap,HashTable,HashSet等

也就是说hashCode()在散列表中才有用,在其他情况下没用,在散列表中hashCode()的作用是获取对象的散列码,进而确定该对象在散列表中的位置


hashCode() 和 equals() 的关系:

1.不会创建该类对应的散列表

是说:我们不会在HashSet,HashTable,HashMap等这些本质为散列表的数据结构中用到这个类,如:不会创建这个类的HashSet结合
2.会创建该类对应的散列表
   是说:我们会在HashSet,HashTable,HashMap等这些本质为散列表的数据结构中用到这个类,如:我们会创建这个类的HashSet集合
这种情况下hashCode和equals是有关系的
如果两个对象相等,那么它们的hashCode()值一定相同。这里的相等是指,通过equals()比较两个对象时返回true。
  * 如果两个对象hashCode()相等,它们并不一定相等。因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。
然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。    

  * 此外,在这种情况下。若要判断两个对象是否相等,除了要使用equals()之外,也要使用hashCode()函数。否则,equals()无效。

例如,创建Person类的HashSet集合,必须同时覆盖Person类的equals() 和 hashCode()方法。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章