Java基礎之【重寫hashCode和equals】

參考:https://www.cnblogs.com/wang-meng/p/7501378.html

如果不被重寫(原生Object)的hashCode和equals是什麼樣的?

  1.   不被重寫(原生)的hashCode值是根據內存地址換算出來的一個值。
  2.   不被重寫(原生)的equals方法是嚴格判斷一個對象是否相等的方法(object1 == object2)

規定:如果兩個對象根據equals(Object)方法是相等的,那麼調用這兩個對象中任一個對象的hashCode方法必須產生同樣的整數結果 反之不成立  

舉例而言:

hashSet add對象的時候,先比較hash 不等的話直接加入,等於的話再通過equals來比較到底是不是同一個對象,是 不加入 否 加入。也就是說不同的對象可以有相同的hash值的(兩個對象具有相同的hash值 但是他們未必是相等的) 可見 hash值只是減少碰撞的機會,減少查詢的成本,同一個hash值可能有多個對象,這個時候再調用equals來比較。

 

https://blog.csdn.net/dong8633950/article/details/79723300

這篇文章寫的很通俗 轉:

1.equal()相等的兩個對象他們的hashCode()肯定相等,也就是用equal()對比是絕對可靠。


2.hashCode()相等的兩個對象他們的equal()不一定相等,就是hashCode()不是絕對可靠。


hashCode是對象在內存地址通過hash算法得到的哈希碼;


比較兩個對象是否相等:


1.首先比較hashcode ,如果hashcode相等則進一步比較equals,不相等則兩個對象肯定不相等;


2.hashset,hashmap,hashtable等等,比如hashset裏要求對象不能重複,則他內部必然要對添加進去的每個對象進行對比,而他的對比規則就是像上面說的那樣,先hashCode(),如果hashCode()相同,再用equal()驗證,如果hashCode()都不同,則肯定不同,這樣對比的效率就很高了。


equals方法的作用
 
1、默認情況(沒有覆蓋equals方法)下equals方法都是調用Object類的equals方法,而Object的equals方法主要用於判斷對象的內存地址引用是不是同一個地址(是不是同一個對象)。


2 、要是類中覆蓋了equals方法,那麼就要根據具體的代碼來確定equals方法的作用了,覆蓋後一般都是通過對象的內容是否相等來判斷對象是否相等。

 

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