中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

HashMap和TreeMap的內部結構是什么

HashMap和TreeMap的內部結構是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

成都創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網技術服務公司,擁有項目做網站、成都網站設計網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元白山做網站,已為上家服務,為白山各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

一、HashMap 

1、基于哈希表的 Map 接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)此類不保證映射的順序,特別是它不保證該順序恒久不變。

2、HashMap 的實例有兩個參數(shù)影響其性能:初始容量 和加載因子。容量是哈希表中桶的數(shù)量,初始容量只是哈希表在創(chuàng)建時的容量。加載因子是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數(shù)超出了加載因子與當前容量的乘積時,則要對該哈希表進行rehash 操作(即重建內部數(shù)據(jù)結構),從而哈希表將具有大約兩倍的桶數(shù)。

按照key關鍵字的哈希值和buckets數(shù)組的長度取模查找桶的位置,如果key的哈希值相同,Hash沖突(也就是指向了同一個桶)則每次新添加的作為頭節(jié)點,而最先添加的在表尾。

HashMap和TreeMap的內部結構是什么

HashMap中的桶的個數(shù)就是下圖中的0- n的數(shù)組的長度,存儲第一個entry的位置叫‘桶(bucket)’而桶中只能存一個值也就是鏈表的頭節(jié)點,鏈表的每個節(jié)點就是添加的一個值(HashMap內部類Entry的實例Entry有哪些屬性之后在詳說),也可以這樣理解,一個entry 類型的存儲鏈表的數(shù)組。數(shù)組的索引位置就是一個個桶的索引地址。

HashMap和TreeMap的內部結構是什么

從上圖我們可以發(fā)現(xiàn)哈希表是由數(shù)組+鏈表組成的,一個長度為16的數(shù)組中,每個元素存儲的是一個鏈表的頭結點。那么這些元素是按照什么樣的規(guī)則存儲到數(shù)組中呢。一般情況是通過hash(key)%len獲得,也就是元素的key的哈希值對數(shù)組長度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存儲在數(shù)組下標為12的位置。

HashMap簡單總結:

1、HashMap 是鏈式數(shù)組(存儲鏈表的數(shù)組)實現(xiàn)查詢速度可以,而且能快速的獲取key對應的value;

2、查詢速度的影響因素有 容量和負載因子,容量大負載因子小查詢速度快但浪費空間,反之則相反;

3、數(shù)組的index值是(key 關鍵字, hashcode為key的哈希值, len 數(shù)組的大?。篽ashcode%len的值來確定,如果容量大負載因子小則index相同(index相同也就是指向了同一個桶)的概率小,鏈表長度小則查詢速度快,反之index相同的概率大鏈表比較長查詢速度慢。

4、對于HashMap以及其子類來說,他們是采用hash算法來決定集合中元素的存儲位置,當初始化HashMap的時候系統(tǒng)會創(chuàng)建一個長度為capacity的Entry數(shù)組,這個數(shù)組里可以存儲元素的位置稱為桶(bucket),每一個桶都有其指定索引,系統(tǒng)可以根據(jù)索引快速訪問該桶中存儲的元素。

5、無論何時HashMap 中的每個桶都只存儲一個元素(Entry 對象)。由于Entry對象可以包含一個引用變量用于指向下一個Entry,因此可能出現(xiàn)HashMap 的桶(bucket)中只有一個Entry,但這個Entry指向另一個Entry 這樣就形成了一個Entry 鏈。

6、通過上面的源碼發(fā)現(xiàn)HashMap在底層將key_value對當成一個整體進行處理(Entry 對象)這個整體就是一個Entry對象,當系統(tǒng)決定存儲HashMap中的key_value對時,完全沒有考慮Entry中的value,而僅僅是根據(jù)key的hash值來決定每個Entry的存儲位置。

JDK1.8中使用一個Node數(shù)組來存儲數(shù)據(jù),但這個Node可能是鏈表結構,也可能是紅黑樹結構如果插入的key的hashcode相同,那么這些key也會被定位到Node數(shù)組的同一個格子里。

如果同一個格子里的key不超過8個,使用鏈表結構存儲。如果超過了8個,那么會調用treeifyBin函數(shù),將鏈表轉換為紅黑樹。那么即使hashcode完全相同,由于紅黑樹的特點,查找某個特定元素,也只需要O(log n)的開銷

也就是說put/get的操作的時間復雜度最差只有O(log n)。

需要注意:key的對象,必須正確的實現(xiàn)了Compare接口

二、TreeMap

紅黑樹是一種近似平衡的二叉查找樹,它能夠確保任何一個節(jié)點的左右子樹的高度差不會超過二者中較低那個的一陪。具體來說,紅黑樹是滿足如下條件的二叉查找樹(binary search tree):

  1. 每個節(jié)點要么是紅色,要么是黑色。

  2. 根節(jié)點必須是黑色

  3. 紅色節(jié)點不能連續(xù)(也即是,紅色節(jié)點的孩子和父親都不能是紅色)。

  4. 對于每個節(jié)點,從該點至null(樹尾端)的任何路徑,都含有相同個數(shù)的黑色節(jié)點。

在樹的結構發(fā)生改變時(插入或者刪除操作),往往會破壞上述條件3或條件4,需要通過調整使得查找樹重新滿足紅黑樹的條件。

HashMap和TreeMap的內部結構是什么2、TreeMap的底層使用了紅黑樹來實現(xiàn),像TreeMap對象中放入一個key-value 鍵值對時,就會生成一個Entry對象,這個對象就是紅黑樹的一個節(jié)點,其實這個和HashMap是一樣的,一個Entry對象作為一個節(jié)點,只是這些節(jié)點存放的方式不同。

3、存放每一個Entry對象時都會按照key鍵的大小按照二叉樹的規(guī)范進行存放,所以TreeMap中的數(shù)據(jù)是按照key從小到大排序的。

   程序添加新節(jié)點時,總是從樹的根節(jié)點開始比較,即將根節(jié)點當成當前節(jié)點。如果新增節(jié)點大于當前節(jié)點并且當前節(jié)點的右節(jié)點存在,則以右節(jié)點作為當前節(jié)點,如果新增節(jié)點小于當前節(jié)點并且當前節(jié)點的左子節(jié)點存在,則以左子節(jié)點作為當前節(jié)點;如果新增節(jié)點等于當前節(jié)點,則用新增節(jié)點覆蓋當前節(jié)點,并結束循環(huán) 直到某個節(jié)點的左右子節(jié)點不存在,將新節(jié)點添加為該節(jié)點的子節(jié)點。如果新節(jié)點比該節(jié)點大,則添加其為右子節(jié)點。如果新節(jié)點比該節(jié)點小,則添加其為左子節(jié)點。

看完上述內容,你們掌握HashMap和TreeMap的內部結構是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

文章標題:HashMap和TreeMap的內部結構是什么
本文來源:http://www.rwnh.cn/article46/jdgieg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供云服務器、標簽優(yōu)化、微信公眾號、電子商務、網站建設、用戶體驗

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
双流县| 榆社县| 新绛县| 贺兰县| 杂多县| 桐城市| 洛隆县| 福海县| 垣曲县| 台山市| 宁阳县| 察雅县| 永年县| 巴塘县| 敦化市| 开江县| 依安县| 丹巴县| 岳普湖县| 陵川县| 武宁县| 神木县| 米脂县| 深圳市| 长治市| 大洼县| 盐源县| 综艺| 轮台县| 平潭县| 木兰县| 柳州市| 武功县| 新民市| 梨树县| 靖州| 河津市| 贵德县| 高淳县| 会东县| 额尔古纳市|