淺談hashCode()和equals()

java.lang.Object類中有兩個比較重要的方法:

public native int hashCode();

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

1.hasCode()方法

        理解hash code之前,先理解hash表

1.1hash表

        hash表:根據關鍵碼值(Key value)而直接進行訪問的數據結構。它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度

        給定表M,存在函數f(key),對任意給定的關鍵字值key,代入函數後若能得到包含該關鍵字的記錄在表中的地址,則稱表M爲哈希(hash)表,函數f(key)爲哈希(hash) 函數。

舉個例子
        hash表M長爲n = 13,存在一個hash函數f(key) = key % n
key = {6, 37,49,28,46,12,13},然後依次把這些key帶入hash函數中,便可得出對應的hash code。
如:key = 6,f(6) = 6 % 13 = 6,則,key = 6的hash code 爲6
在這裏插入圖片描述
        簡單來說:在記錄的存儲位置和它的關鍵字之間建立一個確定的對應關係f,使每個關鍵字和結構中一個唯一的存儲位置相對應。

1.1hash code是什麼?

  • 從文檔上看,hashCode()方法給對象返回一個hash code值(int型)。這個方法被用於hash tables,例如HashMap。
  • 從方法本身來看,它是個本地方法,它的實現是與本地機器相關的。hash code是通過對象的內存地址經過hash算法得到的

String、Integer、Double等這些類都是覆蓋了hashCode()方法的

1.2hash code作用

        hash code的存在主要是爲了查找的快捷性(提高效率)。hash code是用來在散列存儲結構中確定對象的存儲地址的

         對於容器類設計 基本上都會涉及到hash code。hashCode()方法的主要作用是爲了配合基於散列的集合一起正常運行,這樣的散列集合包括HashSet、HashMap、HashTable等。

        在對集合進行插入操作時,有些集合內部是不允許存在重複元素的,這樣就引發了一個問題

如何判斷在集合中是否已經存在該對象了?

        首先想到的方法就是調用equals()方法,這個方法確實可行。但是如果集合中已經存在大量的數據或者更多的數據,如果採用equals方法去逐一比較,效率必然是一個問題。

        此時hashCode方法的作用就體現出來了:當集合要添加新的對象時,先調用這個對象的hashCode方法,得到對應的hash code值。如果table中沒有該hash code值,它就可以直接存進去,不用再進行任何比較了;如果存在該hash code值, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。這樣一來實際調用equals方法的次數就大大降低了。

        簡而言之,在集合查找時,hashcode能大大降低對象比較次數,提高查找效率!

2.equals()方法

equals()方法是用來判斷其他的對象是否和該對象相等.

equals()方法在object類中定義如下:

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

        很明顯是對兩個對象的地址值進行的比較(即比較引用是否相同)。但是,String 、Math、Integer、Double等這些封裝類在使用equals()方法時,已經覆蓋了object類的equals()方法,都是進行對內容的比較

【注意】:當equals()方法被override時,hashCode()也要被override。因爲按照一般hashCode()方法的實現來說,相等的對象,它們的hash code一定相等。

Java對於eqauls方法和hashCode方法是這樣規定的:

  1. equals()相等的兩個對象他們的hashCode()肯定相等,也就是用equals()對比是絕對可靠的。
  2. hashCode()相等的兩個對象他們的equals()不一定相等,也就是hashCode()不是絕對可靠的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章