大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java基礎學習:hashmap定義

Java基礎學習:hashmap定義

更新時間:2020-04-30 14:07:13 來源:動力節點 瀏覽4208次

    一、HashMap基礎

    基本定義:根據源代碼的描述可知,HashMap是基于哈希表的Map接口的實現,其包含了Map接口的所有映射操作,并且允許使用null鍵和null值。

    與HashTable的區別:HashMap可以近似地看成是HashTable,但是它是非線程安全的,并且允許使用null鍵和null值,而這些都與HashTable恰巧相反。

    注:HashMap可以使用ConcurrentHashMap代替,ConcurrentHashMap是一個線程安全,更加快速的HashMap。

    存儲結構:HashMap的存儲結構其實就是哈希表的存儲結構(由數組與鏈表結合組成,稱為鏈表的數組)。如下圖所示:

Java基礎學習:hashmap定義

    /**

    *Thetable,initializedonfirstuse,andresizedas

    *necessary.Whenallocated,lengthisalwaysapoweroftwo.

    *(Wealsotoleratelengthzeroinsomeoperationstoallow

    *bootstrappingmechanicsthatarecurrentlynotneeded.)

    */

    transientNode[]table;

    staticclassNodeimplementsMap.Entry{

    finalinthash;

    finalKkey;

    Vvalue;

    Nodenext;

    ...

    }

    HashMap的主干是一個Entry數組。Entry是HashMap的基本組成單元,每一個Entry包含一個key-value鍵值對。

    如上圖所示,HashMap中元素存儲的形式是鍵-值對(key-value對,即Entry對),所有具有相同hashcode值的鍵(key)所對應的entry對會被鏈接起來組成一條鏈表,而數組的作用則是存儲鏈表中第一個結點的地址值。

    二、影響HashMap性能的因素

    在HashMap中,還存在著兩個概念,桶(buckets)和加載因子(loadfactor)。

    桶(buckets):上圖中的標有0、1、2、3、….、11所對應的數組空間就是一個個桶。

    加載因子(loadfactor):是哈希表在其容量自動增加之前可以達到多滿的一種尺度,默認值是0.75。

    根據源代碼中所述,影響HashMap性能有兩個因素:哈希表中的初始化容量(桶的數量)和加載因子。當哈希表中條目數超過了當前容量與加載因子的乘積時,哈希表將會作出自我調整,將容量擴充為原來的兩倍,并且重新將原有的元素重新映射到表中,這一過程成為rehash。看到這里,相必大家會發現rehash操作是會造成時間與空間的開銷的,因此為什么初始化容量與加載因子會影響HashMap的性能也就可以理解了。

    三、put/get方法實現原理

    put操作:HashMap在進行put操作的時候,會首先調用Key值中的hashCode()方法,用于獲取對應的bucket的下標值以便存放數據。

    HashMap通過key值的hashCode獲得了對應的bucket存儲空間的下標,然后進入bucket空間,通過鏈表遍歷的方式逐個查詢,看看鏈表中是否已經存在了這個key的鍵-值對,如果已經存在則用新值替換舊值,否則插入新的鍵-值對。

    看到這里,相信大家會發現,hashCode值相同的兩個值可能是不同的兩個對象,而當put進去的是另一個hashCode值相等的對象時,會發生沖突,而在HashMap中解決這種沖突的方法就是將hashCode值相同的key值所對應的key-value對串聯成一條鏈表,請見上面的HashMap數據結構圖。

    get操作:HashMap在進行get操作的時候,與put方法類似,會首先調用Key值中的hashCode()方法,用于獲取對應的bucket的下標值,找到bucket的位置后,再通過key.equals()方法找到對應的鍵-值對,從而獲得對應的value值。

    總結

    HashMap是基于hashing原理對key-value對進行存儲與獲取,當使用put()方法添加key-value對時,它會首先檢查hashCode的值,并以此獲得對應的bucket位置進行存儲,當發生沖突時(hashCode值相同的兩個不同key),新的key-value對會以結點的形式添加到鏈表的末尾(先看看鏈表中是否已經存在了這個key,如果已經存在,則更新;否則就添加到鏈表的末尾)。而使用get()方法時,同樣地會根據key的hashCode值找到相應的bucket位置,再通過key.equals()方法找到對應的key-value對,最終成功獲取value值。

Java基礎學習:hashmap定義

 以上就是動力節點java培訓機構的小編針對“Java基礎學習:hashmap定義”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 尹人在线视频 | 亚洲欧美精品中字久久99 | 欧美成人看片黄a免费 | 4hu在线观看 | 欧美久久久久久久久 | 国产高清精品91在线 | 亚洲免费资源 | 福利资源在线 | 奇米影视444 | 精品国产免费福利片 | 国产亚洲精品成人一区看片 | 色综合久久天天综线观看 | 国产精品麻豆99久久 | 久久婷婷是五月综合色狠狠 | 日韩不卡一级毛片免费 | 久草青青在线视频 | 人人做人人性 | 久久免费视频一区 | 欧美成人免费一区在线播放 | 又爽又黄又无遮挡的视频在线观看 | 亚洲线精品久久一区二区三区 | 91亚洲国产成人久久精品网站 | 久久视频精品36线视频在线观看 | 久久婷婷人人澡人人爱91 | 香香影院在线观看 | 国产色啪午夜免费视频 | 日韩欧美亚洲在线 | 伊人国产在线 | 国产精品免费一级在线观看 | 深夜福利免费在线观看 | 日日摸夜夜添夜夜添久久 | 国内精品久久久久激情影院 | 全免费午夜一级毛片一级毛 | 亚洲大胆精品337p色 | 国产成a人片在线观看视频 国产成a人片在线观看视频99 | 日韩男女视频 | 中国一级毛片aaa片 中国一级毛片录像 | 一区二区精品在线观看 | 久久资源总站 | 毛片爱做的片 | 四虎成人免费视频 |