亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

HashMap原理詳講

2019-11-10 19:17:18
字體:
來源:轉載
供稿:網友

HashMap詳講

HashMap詳講hashing散列法或哈希法的概念什么是HashMap以及HashMap的構成HashMap的基本存儲原理以及存儲內容的組成HashMap的工作原理以及存取方法過程HashMap中的碰撞探測collision detection以及碰撞的解決方法如何重新調整HashMap的大小不可變對象的好處HashMap多線程的條件競爭

下面就根據這些問題講解一下HashMap

hashing(散列法或哈希法)的概念

可以自行百度

什么是HashMap以及HashMap的構成

HashMap是基于哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,并允許使用null值和null鍵。HashMap儲存的是鍵值對,HashMap很快。此類不保證映射的順序,特別是它不保證該順序恒久不變。

HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。

數組:存儲區間連續,占用內存嚴重,尋址容易,插入刪除困難; 鏈表:存儲區間離散,占用內存比較寬松,尋址困難,插入刪除容易; Hashmap綜合應用了這兩種數據結構,實現了尋址容易,插入刪除也容易。

hashMap的結構示意圖如下: 這里寫圖片描述

HashMap的基本存儲原理以及存儲內容的組成

基本原理:先聲明一個下標范圍比較大的數組來存儲元素。另外設計一個哈希函數(也叫做散列函數)來獲得每一個元素的Key(關鍵字)的函數值(即數組下標,hash值)相對應,數組存儲的元素是一個Entry類,這個類有三個數據域,key、value(鍵值對),next(指向下一個Entry)。 例如, 第一個鍵值對A進來。通過計算其key的hash得到的index=0。記做:Entry[0] = A。 第二個鍵值對B,通過計算其index也等于0, HashMap會將B.next =A,Entry[0] =B, 第三個鍵值對 C,index也等于0,那么C.next = B,Entry[0] = C;這樣我們發現index=0的地方事實上存取了A,B,C三個鍵值對,它們通過next這個屬性鏈接在一起。我們可以將這個地方稱為桶。 對于不同的元素,可能計算出了相同的函數值,這樣就產生了“沖突”,這就需要解決沖突,“直接定址”與“解決沖突”是哈希表的兩大特點。

HashMap的工作原理以及存取方法過程

HashMap的工作原理 :HashMap是基于散列法(又稱哈希法hashing)的原理,使用put(key, value)存儲對象到HashMap中,使用get(key)從HashMap中獲取對象。當我們給put()方法傳遞鍵和值時,我們先對鍵調用hashCode()方法,返回的hashCode用于找到bucket(桶)位置來儲存Entry對象?!盚ashMap是在bucket中儲存鍵對象和值對象,作為Map.Entry。并不是僅僅只在bucket中存儲值。

HashMap具體的存取過程如下: put鍵值對的方法的過程是: 1、獲取key ; 2、通過hash函數得到hash值; int hash=key.hashCode(); //獲取key的hashCode,這個值是一個固定的int值

3、得到桶號(一般都為hash值對桶數求模) ,也即數組下標int index=hash%Entry[].length。//獲取數組下標:key的hash值對Entry數組長度進行取余

4、 存放key和value在桶內。 table[index]=Entry對象;

get值方法的過程是: 1、獲取key 2、通過hash函數得到hash值 int hash=key.hashCode();

3、得到桶號(一般都為hash值對桶數求模) int index =hash%Entry[].length;

4、比較桶的內部元素是否與key相等,若都不相等,則沒有找到。

5、取出相等的記錄的value。

HashMap中直接地址用hash函數生成;解決沖突,用比較函數解決。如果每個桶內部只有一個元素,那么查找的時候只有一次比較。當許多桶內沒有值時,許多查詢就會更快了(指查不到的時候)。

HashMap中的碰撞探測(collision detection)以及碰撞的解決方法

當兩個對象的hashcode相同時,它們的bucket位置相同,‘碰撞’會發生。因為HashMap使用LinkedList存儲對象,這個Entry(包含有鍵值對的Map.Entry對象)會存儲在LinkedList中。這兩個對象就算hashcode相同,但是它們可能并不相等。 那如何獲取這兩個對象的值呢?當我們調用get()方法,HashMap會使用鍵對象的hashcode找到bucket位置,遍歷LinkedList直到找到值對象。找到bucket位置之后,會調用keys.equals()方法去找到LinkedList中正確的節點,最終找到要找的值對象使用不可變的、聲明作final的對象,并且采用合適的equals()和hashCode()方法的話,將會減少碰撞的發生,提高效率。不可變性使得能夠緩存不同鍵的hashcode,這將提高整個獲取對象的速度,使用String,Interger這樣的wrapper類作為鍵是非常好的選擇。

如何重新調整HashMap的大小

“如果HashMap的大小超過了負載因子(load factor)定義的容量,怎么辦?” 默認的負載因子大小為0.75,也就是說,當一個map填滿了75%的bucket時候,和其它集合類(如ArrayList等)一樣,將會創建原來HashMap大小的兩倍的bucket數組,來重新調整map的大小,并將原來的對象放入新的bucket數組中。這個過程叫作rehashing,因為它調用hash方法找到新的bucket位置。

不可變對象的好處

上面說到使用包裝類時刻作為鍵的原因是 String, Interger這樣的wrapper類作為HashMap的鍵是很合適的,而且String最為常用。因為String是不可變的,也是final的,而且已經重寫了equals()和hashCode()方法了。其他的wrapper類也有這個特點。不可變性是必要的,因為為了要計算hashCode(),就要防止鍵值改變,如果鍵值在放入時和獲取時返回不同的hashcode的話,那么就不能從HashMap中找到你想要的對象。不可變性還有其他的優點如線程安全。如果你可以僅僅通過將某個field聲明成final就能保證hashCode是不變的,那么請這么做吧。因為獲取對象的時候要用到equals()和hashCode()方法,那么鍵對象正確的重寫這兩個方法是非常重要的。如果兩個不相等的對象返回不同的hashcode的話,那么碰撞的幾率就會小些,這樣就能提高HashMap的性能。

HashMap多線程的條件競爭

重新調整HashMap大小存在什么問題嗎?”在多線程的情況下,可能產生條件競爭(race condition)。因為如果兩個線程都發現HashMap需要重新調整大小了,它們會同時試著調整大小。在調整大小的過程中,存儲在LinkedList中的元素的次序會反過來,因為移動到新的bucket位置的時候,HashMap并不會將元素放在LinkedList的尾部,而是放在頭部,這是為了避免尾部遍歷(tail traversing)。如果條件競爭發生了,那么就死循環了。(在多線程的情況下,為什么還要使用HashMap呢?不懂)

我們也可以使用自定義的對象作為鍵,只要它遵守了equals()和hashCode()方法的定義規則,并且當對象插入到Map中之后將不會再改變了。如果這個自定義對象時不可變的,那么它已經滿足了作為鍵的條件,因為當它創建之后就已經不能改變了。

我們可以使用CocurrentHashMap來代替HashTable嗎?這是另外一個很熱門的面試題,因為ConcurrentHashMap越來越多人用了。我們知道HashTable是synchronized的,但是ConcurrentHashMap同步性能更好,因為它僅僅根據同步級別對map的一部分進行上鎖。ConcurrentHashMap當然可以代替HashTable,但是HashTable提供更強的線程安全性。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲自拍小视频免费观看| 色狠狠久久aa北条麻妃| 久久精品国产久精国产一老狼| 疯狂欧美牲乱大交777| 98精品在线视频| 欧美黑人一区二区三区| 欧美视频在线免费| 91影院在线免费观看视频| 成人免费视频在线观看超级碰| 欧美日韩加勒比精品一区| 国产成人在线亚洲欧美| 92看片淫黄大片欧美看国产片| 欧美极品美女视频网站在线观看免费| 色午夜这里只有精品| 国模私拍一区二区三区| 成人a视频在线观看| 欧美精品日韩三级| 欧美伊久线香蕉线新在线| 欧美国产日韩中文字幕在线| 成人激情春色网| 久久国产精品影视| 亚洲欧美日韩一区二区在线| 欧美丰满片xxx777| 亚洲丝袜在线视频| 欧美色欧美亚洲高清在线视频| 狠狠操狠狠色综合网| 亚洲欧美日韩国产成人| 亚洲国产美女精品久久久久∴| 欧美精品激情在线| 国产在线a不卡| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲第一级黄色片| 国模私拍一区二区三区| 国产精品99久久久久久久久久久久| 国产精品女主播| 亚洲成人在线网| 国产午夜精品久久久| 久久久久国产精品www| 夜夜嗨av一区二区三区四区| 日韩在线视频播放| 欧美疯狂性受xxxxx另类| 丝袜一区二区三区| 久久全国免费视频| 大荫蒂欧美视频另类xxxx| 欧美多人乱p欧美4p久久| 成人在线播放av| 色综合色综合网色综合| 日韩电影视频免费| 国产婷婷97碰碰久久人人蜜臀| 国产亚洲美女久久| 国产成人自拍视频在线观看| 国产精品99久久久久久人| 欧美在线一区二区视频| 日韩精品视频在线观看网址| 亚洲国产又黄又爽女人高潮的| 亚洲xxx自由成熟| 韩国精品美女www爽爽爽视频| 久久久精品在线观看| 国产精品久久久av| 国产精品爽黄69| 久久久久中文字幕2018| 欧美国产激情18| 国内精品小视频在线观看| 亚洲激情国产精品| 一本色道久久88亚洲综合88| 在线看日韩欧美| 日韩欧美福利视频| 国产经典一区二区| 欧美色视频日本版| 亚洲电影免费观看高清完整版| 亚洲肉体裸体xxxx137| 国产日韩欧美夫妻视频在线观看| 亚洲第一福利视频| 亚洲国模精品私拍| 77777少妇光屁股久久一区| 成人久久一区二区| 色樱桃影院亚洲精品影院| 亚洲精品久久久久中文字幕欢迎你| 亚洲精品福利资源站| 中文亚洲视频在线| 国产精品av免费在线观看| 日本久久久久亚洲中字幕| 成人黄色片在线| 欧美在线激情视频| 亚洲第一av网| 日本19禁啪啪免费观看www| 亚洲精品一区二区网址| 色综合久综合久久综合久鬼88| 亚洲国产成人精品女人久久久| 亚洲国产精久久久久久久| 岛国av一区二区在线在线观看| 国产精品久久二区| 日韩高清av在线| 91日韩在线播放| 中文字幕日韩欧美精品在线观看| 国产欧洲精品视频| 欧美在线日韩在线| 97精品国产97久久久久久| 成人国产亚洲精品a区天堂华泰| 91午夜在线播放| 亚洲欧美自拍一区| 欧美不卡视频一区发布| 欧美网站在线观看| 一区二区三区国产在线观看| 国产精自产拍久久久久久| 尤物精品国产第一福利三区| 久久久久久12| 亚洲性无码av在线| 国产综合在线看| 中文字幕在线国产精品| 日韩欧美国产成人| 97久久超碰福利国产精品…| 亚洲乱亚洲乱妇无码| 欧美性生交xxxxxdddd| 日韩av电影国产| 亚洲va欧美va国产综合剧情| 日韩精品有码在线观看| 日韩av一区在线观看| 岛国av一区二区三区| 日韩一二三在线视频播| 国产精品久久国产精品99gif| 久久精品99久久久久久久久| 成人免费看片视频| 国产欧美日韩亚洲精品| 57pao国产精品一区| 午夜精品99久久免费| 91亚洲精品久久久久久久久久久久| 在线精品国产欧美| 国产91在线播放精品91| 亚洲欧洲国产精品| 亚洲女同性videos| 亚洲国产精品成人av| 成人免费网站在线| 97涩涩爰在线观看亚洲| 色偷偷av一区二区三区乱| 国产视频福利一区| 亚洲 日韩 国产第一| 国产成人欧美在线观看| 国产精品影片在线观看| 国产视频精品va久久久久久| 亚洲自拍小视频免费观看| 欧美一级电影在线| 国产成人精品日本亚洲| 国产精品久久久久久五月尺| 久久男人av资源网站| 日韩在线精品一区| 91夜夜未满十八勿入爽爽影院| 精品中文字幕在线2019| 欧美精品久久久久久久| 91精品国产乱码久久久久久蜜臀| 亚洲精品videossex少妇| 日本一欧美一欧美一亚洲视频| 欧美日韩精品在线观看| 国产午夜精品久久久| xxav国产精品美女主播| 欧美在线影院在线视频| 日韩av网站导航| 欧美电影在线观看完整版| 免费91麻豆精品国产自产在线观看| 久久久久www| 日韩欧美亚洲综合| 自拍偷拍亚洲欧美| 日日骚av一区| 国产啪精品视频|