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