您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Java中hashcode方法如何使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
首先,想要明白hashCode的作用,你必須要先知道Java中的集合。
總的來說,Java中的集合(Collection)有兩類,一類是List,再有一類是Set。你知道它們的區別嗎?前者集合內的元素是有序的,元素可以重復;后者元素無序,但元素不可重復。那么這里就有一個比較嚴重的問題了:要想保證元素不重復,可兩個元素是否重復應該依據什么來判斷呢?這就是Object.equals方法了。但是,如果每增加一個元素就檢查一次,那么當元素很多時,后添加到集合中的元素比較的次數就非常多了。也就是說,如果集合中現在已經有1000個元素,那么第1001個元素加入集合時,它就要調用1000次equals方法。這顯然會大大降低效率。于是,Java采用了哈希表的原理。哈希(Hash)實際上是個人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也稱為散列算法,是將數據依特定算法直接指定到一個地址上。如果詳細講解哈希算法,那需要更多的文章篇幅,我在這里就不介紹了。初學者可以這樣理解,hashCode方法實際上返回的就是對象存儲的物理地址(實際可能并不是)。
這樣一來,當集合要添加新的元素時,先調用這個元素的hashCode方法,就一下子能定位到它應該放置的物理位置上。如果這個位置上沒有元素,它就可以直接存儲在這個位置上,不用再進行任何比較了;如果這個位置上已經有元素了,就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址。所以這里存在一個沖突解決的問題。這樣一來實際調用equals方法的次數就大大降低了,幾乎只需要一兩次。
所以,Java對于eqauls方法和hashCode方法是這樣規定的:
1、如果兩個對象相同,那么它們的hashCode值一定要相同;
2、如果兩個對象的hashCode相同,它們并不一定相同,上面說的對象相同指的是用eqauls方法比較。
你當然可以不按要求去做了,但你會發現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。
這是一種算法,數據結構里面有提到。在某一個地址上(對應一個哈希值,該值并不特指內存地址),存儲的是一個鏈表。在put一個新值時,根據該新值計算出哈希值,找到相應的位置,發現該位置已經蹲了一個,則新值就鏈接到舊值的下面,由舊值指向(next)它(也可能是倒過來指。。。)。可以參考HashMap。
可以把hashcode理解為,一大片有編號的桶,如果你的散列算法好的話,可以保證每個不同的對象可以放在不同的桶里面,也就是每個不同的對象都有不同的HashCode(同上的編號)。這樣的話,如果你尋找某個對象的時候,計算一下這個對象的hashcode然后直接就可以到對應的桶里面取道這個對象。
但是如果你的散列算法不好的話,也就是任何對象都有一個相同的hashCode,也就是說現在之后一個桶了,你所有的對象都要放在這個桶里面,這樣的話,當你尋找某個對象的時候,雖然可以很快確定要去那個同里面尋找,但是如果桶里面有幾千萬個對象,那樣的話你就需要逐個調用equals了。效率就太差了.
hash code是一種編碼方式,在Java中,每個對象都會有一個hashcode,Java可以通過這個hashcode來識別一個對象。至于hashcode的具體編碼方式,比較復雜(事實上這個編碼是可以由程序員通過繼承和接口的實現重寫的),可以參考數據結構書籍。而hashtable等結構,就是通過這個哈希實現快速查找鍵對象。這是他們的內部聯系,但一般編程時無需了解這些,只要知道hashtable實現了一種無順序的元素排列就可以了。.
兩個對象值相同(x.equals(y) == true),則一定有相同的hash code。
因為:Hash,一般翻譯做“散列”,也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-maping),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。
以下是java語言的定義:
1) 對象相等則hashCode一定相等;
2) hashCode相等對象未必相等。
這也涉及到如何寫自定義的hashCode方法的問題:必須符合以上條件。注意條件2中的未必。具體可參見java doc; Effective Java中有更詳細論述。
補充一點個人簡介 hash 就是 類似于數學集合, 每一個鍵,k可以對應一個或多個值,對象就類似于值,所以“相同的對象”具有相同的鍵值,也就是hashCode;
看完上述內容,你們對Java中hashcode方法如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。