1. 程式人生 > >閱讀原始碼,HashMap回顧

閱讀原始碼,HashMap回顧

[toc]
本文一是總結前面兩種集合,補充一些遺漏,再對HashMap進行簡單介紹。 ## 回顧 因為前兩篇ArrayList和LinkedList都是針對單獨的集合類分析的,只見樹木未見森林,今天分析HashMap,可以結合起來看一下java中的集合框架。下圖只是一小部分,而且為了方便理解去除了抽象類。 ![集合體系](https://img2020.cnblogs.com/blog/1419546/202103/1419546-20210304230024332-1141512537.png) Java中的集合(有時也稱為容器)是為了儲存物件,而且多數時候儲存的不止一個物件。 可以簡單的將Java集合分為兩類: - 一類是Collection,儲存的是獨立的元素,也就是單個物件。細分之下,常見的有List,Set,Queue。其中List保證按照插入的順序儲存元素。Set不能有重複元素。Queue按照佇列的規則來存取元素,一般情況下是“先進先出”。 - 一類是Map,儲存的是“鍵值對”,通過鍵來查詢值。比如現實中通過姓名查詢電話號碼,通過身份證號查找個人詳細資訊等。 理論上說我們完全可以只用Collection體系,比如將鍵值對封裝成物件存入Collection的實現類,之所以提出Map,最主要的原因是效率。 ## HashMap簡介 HashMap用來儲存鍵值對,也就是一次儲存兩個元素。在jdk1.8中,其實現是基於==陣列+連結串列+紅黑樹==,簡單說就是普通情況直接用陣列,發生雜湊衝突時在衝突位置改為連結串列,當連結串列超過一定長度時,改為紅黑樹。 可以簡單理解為:==在陣列中存放連結串列或者紅黑樹==。 1. 完全沒有雜湊衝突時,陣列每個元素是一個容量為1的連結串列。如索引0和1上的元素。 2. 發生較小雜湊衝突時,陣列每個元素是一個包含多個元素的連結串列。如索引2上的元素。 3. 當衝突數量超過8時,陣列每個元素是一棵紅黑樹。如索引6上的元素。 下圖為示意圖,相關結構沒有嚴格遵循規範。 ![HashMap的儲存結構](https://img2020.cnblogs.com/blog/1419546/202103/1419546-20210304230037961-1903855586.png) ## 類簽名 ```java public class