程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java中Object類的equals()和hashCode()方法深入解析

Java中Object類的equals()和hashCode()方法深入解析

編輯:關於JAVA

1.equals()

在初學Java的時候,很多人會說在比較對象的時候,==是比較地址,equals()是比較對象的內容,誰說的?

看看equals()方法在Object類中的定義:

public boolean equals(Object obj){
     return (this == obj);
}

這是比較內容麼?明顯是比較指針(地址)麼...

但是為什麼會有equals是比較內容的這種說法呢?

因為在String、Double等封裝類中,已經重載(overriding)了Object類的equals()方法,於是有了另一種計算公式,是進行內容的比較。

比如在String類中:

public int hashCode() {
     int h = hash;
     if (h == 0) {
         char val[] = value;
         int len = count;
         for (int i = 0; i < len; i++) {
             h = 31*h + val[off++];
         }
         hash = h;
     }
     return h;
}

2.hashCode()

在Object類中的定義為:

public native int hashCode();

是一個本地方法,返回的對象的地址值。

但是,同樣的思路,在String等封裝類中對此方法進行了重寫。方法調用得到一個計算公式得到的int值

3.兩者的關系

①兩個obj,如果equals()相等,hashCode()一定相等

②兩個obj,如果hashCode()相等,equals()不一定相等

原因:從散列的角度考慮,不同的對象計算哈希碼的時候,可能引起沖突,大家一定還記得數據結構中沖突的解決方案吧

但是要這麼設計,用兩個函數,個人的理解是為了比較兩個對象時更高效。

可以考慮在Java集合中,判斷兩個對象是否相等的規則是:

第一步,如果hashCode()相等,則查看第二步,否則不相等;

第二步,查看equals()是否相等,如果相等,則兩obj相等,否則還是不相等。

為什麼這樣做?個人的理解是讓適當的函數完成適當的功能,畢竟hashCode()比equals()在某種程度上來得快。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved