Java,數據結構與集合源碼,關于Map接口的實現類(HashMap、LinkedHashMap)

HashMap中的元素的特點:

HashMap中的所有key之間是不可重復的、無序的。所有的key構成一個Set集合。
HashMap中的所有的value彼此之間是可重復的、無序的。所有的value構成一個Collection集合。
HashMap中的一對key-value,就構成了一個entry。Map中的entry是不可重復的、無序的。所有的entry就構成了一個Set集合。

HashMap的源碼剖析:

jdk7:

HashMap < String , Integer > map = new HashMap<>(); //①
map.put("AA",78);//②
①:創建對象的過程中,底層會初始化數組,長度為16,即:Entry[ ] table = new Entry[16];
②:“AA”和78封裝到一個Entry對象中,將此對象添加到table數組中。

添加的過程:

將(key1,value1)添加到當前map中:
首先,需要調用key1所在類的hashCode( )方法,計算key1對應的哈希值1,此哈希值1經過某種算法(hash( ))之后,得到哈希值2。
哈希值2再經過某種算法(indexFor( ))之后,就確定了其在數組table的索引位置i。
????????·如果此索引位置i的數組位置上沒有元素,則(key1,value1)添加成功。——情況①
????????·如果此索引位置i的數組位置上有元素(若為key2),則需要繼續比較key1和key2的哈希值2。-->哈希沖突。
?? ?????????????????·如果key1的哈希值與key2的哈希值不相同,則(key1,value1)也添加成功。——情況②
· 如果key1的哈希值與key2的哈希值相同,則需要則需要繼續判斷key1和key2的equals( )的返回值。要調用key1所在類的equals( )方法,將key2作為參數傳入。
?? ??? ?? ? ????????????????????????·如果調用equals( )方法,返回false:則(key1,value1)添加成功。——情況③
?? ??? ?? ????????????????? ????????·如果調用equals( )方法,返回true:則認為key1和key2是相同的。默認情況下,value1替換原有的value2.

添加成功的情況:

情況①:直接將(key1,value1)存放到數組的索引i的位置
情況②與情況③:(key1,value1)元素與現有的(key2,value2)構成單向鏈表結構,(key1,value1)指向(key2,value2),jdk7中即頭插法。

如果滿足以下情況,會擴容:

當元素的個數達到臨界值(數組長度*加載因子)時,就考慮擴容。默認的加載因子為0.75。默認擴容后為原來的兩倍。
如果put方法是添加操作,會返回null。如果put是修改操作,會返回原來位置上的value值。

jdk8中:

①在jdk8中,當創建了HashMap實例以后,底層并沒有初始化table數組。當首次添加(key,value)時,進行判斷,如果發現table尚未初始化,則對數組進行初始化。(懶漢式)
②在jdk8中,HashMap底層定義了Node內部類(實現了Entry接口),替換了jdk7中的Entry內部類。即創建的數組是Node[ ]。
③在jdk8中,出現哈希值沖突的情況,判斷相應的(key,value)可以添加到指定發生哈希沖突的索引上,采用的是原來的元素指向新的元素,即尾插法。
④在jdk7中,底層采用的是數組+單向鏈表。在jdk8中,底層采用的是數組+單向鏈表+紅黑樹。
使用紅黑樹的情況(單向鏈表轉換為紅黑樹):如果數組索引i上的元素的個數達到8,并且數組的長度達到64時,就將此索引i位置上的多個元素改為使用紅黑樹進行存儲。(紅黑樹進行put( )/get( )/remove( )等操作的時間復雜度為O(log n)),比單向鏈表的復雜度O(n)的要更好,性能更高。
紅黑樹退化(單向鏈表轉換為單向鏈表)的情況:當使用紅黑樹的索引i上的元素個數低于6時,就會將紅黑樹結構退化為單向鏈表。

LinkedHashMap與HashMap的關系:

LinkedHashMap是HashMap的子類。
LinkedHashMap在HashMap使用數組+單向鏈表+紅黑樹的基礎上,增加了一對雙向鏈表,記錄添加(key,value)的先后順序。便于遍歷所有的key-value。

HashSet和LinkedHashSet:

Hash底層使用的是HashMap。
LinkedHashSet底層使用的是LinkedHashMap。
HashSet的元素的值存儲在底層的HashMap的key值中,而所有的key值對應的value值都是同一個Object對象,HashSet里用不上其value值。LinkedHashSet同理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163681.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163681.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python常用第三方模塊---openyxl

openyxl模塊&#xff1a;用于處理excel文件的木塊&#xff0c;可以Excel中的數據進行寫入和讀取 函數或類的名稱功能描述load_workbook(filename)打開已經存在的工作簿&#xff0c;結果為工作簿對象 workbook.sheetnames 工作簿對象的sheetnames屬性&#xff0c;用戶獲取所有工…

深入理解 pytest Fixture 方法及其應用!

當涉及到編寫自動化測試時&#xff0c;測試框架和工具的選擇對于測試用例的設計和執行非常重要。在Python 中&#xff0c;pytest是一種廣泛使用的測試框架&#xff0c;它提供了豐富的功能和靈活的擴展性。其中一個很有用的功 能是fixture方法&#xff0c;它允許我們初始化測試環…

《實現領域驅動設計》筆記——上下文映射圖

一個項目的上下文映射圖可以用方式來表示。比較容易的一種是畫一個簡單的框圖表示兩個或多個限界上下文之間的映射關系。該框圖表示了不同的限界上下文在解決方案空間中是如何通過集成相互關聯的。另一種更詳細的方式是通過限界上下文集成的源代碼實現來表示。 上下文映射圖為什…

微軟WHQL認證

windows驅動開發要擺脫在測試模式下的開發&#xff0c;需要通過WHQL認證。 1&#xff1a;申請EV代碼簽名證書。EV代碼簽名證書在后續注冊Windows硬件開發中心帳戶&#xff0c;以及提交WHQL認證前為驅動程序進行數字簽名等流程中都需要用到&#xff0c;所以申請EV代碼簽名證書是…

唯一索引和普通索引的使用上要注意什么

考慮下面一種情況&#xff1a; select name from CUser where id_card xxxxxxxyyyyyyzzzzz;你可能會將id_card作為主鍵了&#xff0c;但最好別這么做。你想想這么長一串的字符串做主鍵&#xff0c;查詢時候效率其實是比較低的&#xff0c;其實是建議選擇其他的作為主鍵。 那么…

BUUCTF [SWPU2019]我有一只馬里奧 1

BUUCTF:https://buuoj.cn/challenges 題目描述&#xff1a; 得到的 flag 請包上 flag{} 提交。 密文&#xff1a; 下載附件&#xff0c;得到一個.exe文件。 解題思路&#xff1a; 1、雙擊.exe文件運行&#xff0c;得到一個1.txt文本。打開&#xff0c;如下圖。 2、提示我們…

Mysql中正則表達式Regexp常見用法

Mysql中正則表達式Regexp常見用法_regexp不包含-CSDN博客

List轉string 逗號分隔

List轉string 逗號分隔 1、將list轉化為逗號分割的字符串 String str String.join(",", list); String str StringUtils.json(list.toArray(), ",");   2、將逗號分隔的字符串轉換為List List<String> list Arrays.asList(str.split("…

當老師應該選文科還是理科

教育不斷發展和改革&#xff0c;教師職業的選擇也越來越受到關注。許多人在選擇專業時都會考慮成為一名教師&#xff0c;但對于選擇文科還是理科卻感到困惑。本文將探討當老師應該選文科還是理科。 文科注重的是人文素養和社會科學方面的知識&#xff0c;而理科則注重自然科學和…

如何做一個簡單的深度集成學習框架

使用同一個框架&#xff0c;獨立在一個數據集上面&#xff0c;分別訓練多次&#xff0c;每個單獨模型訓練超參數可以一樣&#xff0c;也可以不一樣&#xff0c;最后若干個訓練好的獨立模型在測試集數據上面做最后集中決策。 實例代碼如下&#xff1a; class MyEnsemble(nn.Modu…

問題 上位機程序重啟

/ 1、上位機程序重啟&#xff0c; 讀線程被殺死&#xff0c;mcu usb busy&#xff0c;數據在fifo發不出去 下次線程重啟后&#xff0c;在fifo里的數據首先被發送出去。 //

紅旗Asianux Server Linux V8 安裝萬里數據庫(GreatSQL)

紅旗Asianux Server Linux V8 安裝萬里數據庫&#xff08;GreatSQL&#xff09; 紅旗Asianux介紹&#xff1a; 紅旗Asianux Server Linux 8.0是為云時代重新設計的操作系統&#xff0c;為云時代的到來引入了大量新功能&#xff0c;包括用于配置管理、快速遷移框架、編程語言和…

每天5分鐘復習OpenStack(十)Ceph 架構

1、Ceph是什么&#xff1f; “Ceph is a unified, distributed storage system designed for excellent performance, reliability and scalability.”這句話說出了Ceph的特性&#xff0c;它是可靠的、可擴展的、統一的、分布式的存儲系統。Ceph可以同時提供對象存儲RADOSGW&am…

ip_file_Hook項目解讀

程序流程 執行文件訪問攔截和 IP 地址攔截的流程&#xff1a; 文件訪問攔截功能&#xff1a; 當應用程序嘗試執行文件操作&#xff0c;例如打開文件&#xff0c;調用的是 open 或 openat 函數。 由于這兩個函數已經被重定向為自定義的版本&#xff0c;所以實際上調用的是 op…

基于 Flink SQL 和 Paimon 構建流式湖倉新方案

本文整理自阿里云智能開源表存儲負責人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成員李勁松在云棲大會開源大數據專場的分享。本篇內容主要分為四部分&#xff1a; 數據分析架構演進介紹 Apache PaimonFlink Paimon 流式湖倉流式湖倉Demo演示 數據分析架構演進 …

蝦皮數據參謀:知蝦助力商家實現數據化運營的利器

在如今競爭激烈的電商市場中&#xff0c;商家需要準確的數據分析來指導他們的業務決策。Shopee電商平臺的數據分析工具——蝦皮數據參謀&#xff08;知蝦&#xff09;&#xff0c;為商家提供了豐富的數據分析服務&#xff0c;包括商品市場、銷量、價格分布、物流監控、差評監控…

ArkTS聲明式開發范式

裝飾器 用來裝飾類、結構體、方法以及變量&#xff0c;賦予其特殊的含義&#xff0c;如上述示例中 Entry 、 Component 、 State 都是裝飾器。 Component 表示這是個自定義組件&#xff1b; Entry 則表示這是個入口組件&#xff1b; State 表示組件中的狀態變量&#xff0c;…

最新版靈沐V3.3微信資源類小程序源碼支持流量主

源碼簡介 最新版靈沐V3.3微信資源類小程序源碼支持流量主&#xff0c;一套不錯的流量主變現資源下載小程序&#xff0c;它支持在微信、QQ和抖音平臺上運行。這次更新主要集中在全局UI設計的升級&#xff0c;并依然注重資源下載和激勵視頻變現的功能。另外&#xff0c;還新增了…

VR模擬仿真技術為司法科普建設注入更多的智慧和力量

虛擬現實(VR)技術已經逐漸滲透到各個領域&#xff0c;包括司法領域&#xff0c;在法學院教學中&#xff0c;VR虛擬現實和web3d開發技術的興起&#xff0c;讓司法教育也突破傳統教授式、演練式的教學模式&#xff0c;通過VR特有的沉浸式展示特點&#xff0c;實現了真實法庭效果的…

【Sorted Set】Redis常用數據類型: ZSet [使用手冊]

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ 目錄 ⑤Redis Zset 操作命令匯總1. zadd 添加或…