中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中hashcode方法如何使用

發布時間:2021-07-29 16:53:12 來源:億速云 閱讀:167 作者:Leah 欄目:云計算

今天就跟大家聊聊有關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方法如何使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衡南县| 四平市| 云林县| 兴海县| 清水河县| 龙泉市| 图们市| 汕头市| 西乌珠穆沁旗| 米脂县| 萨嘎县| 垦利县| 东丽区| 潮安县| 泽州县| 南川市| 加查县| 喀喇沁旗| 苍南县| 河池市| 旺苍县| 民和| 年辖:市辖区| 新巴尔虎左旗| 马龙县| 江达县| 陆丰市| 防城港市| 县级市| 宜黄县| 新密市| 新余市| 彭山县| 乐清市| 沙湾县| 沐川县| 东乌| 曲阜市| 双江| 古丈县| 芒康县|