HashMap底層資料結構原始碼解析
HashMap應該是每個Java程式設計師日常開發都很熟悉的集合型別,使用也很簡單,不贅述。
import java.util.HashMap;
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer,String> user = new HashMap<>();
//往HashMap裡面存放資料
user.put(1,"張三");
user.put(2,"李四");
user.put(3,"王五");
//從HashMap裡面取資料
String name = user.get(1);
System.out.println(name);
}
}
我們點進put方法裡面看看HashMap都做了啥。
這裡有兩點需要關注的,一個是HashMap的put方法原來是有返回值的(雖然在生產開發中我從來沒有用過hhh) 。上面的註解告訴我們,返回值是key關聯的前一個值,怎麼理解呢?於是我寫了一個測試程式碼測了一下。
import java.util.HashMap;
public class HashMapTest {
public static void main(String[] args) {
HashMap<Integer,String> user = new HashMap<>();
//往HashMap裡面存放資料
System.out.println(user.put(1, "張三"));
System.out.println(user.put(1, "李四"));
System.out.println(user.put(1, "王五"));
System.out.println(user.get(1));
}
}
輸出結果:
null
張三
李四
王五
我們put了三個同樣的key,第一次輸出結果是null,第二次輸出的是第一次put進去的value,第三次輸出第二次put進去的value。結論:如果put進去的key跟HashMap原有的Key發生重複,那麼對應的值會被替換,被替換的值會在返回值中返回。
第二個關注點是hash(key)這個方法。這裡是一個三目運算子,如果key為null返回0,否則返回(key的雜湊值h) XOR (h邏輯右移16位)。Java中的<< 和 >> 和 >>> 詳細分析
那麼來看看key的hash演算法是怎麼算的吧~然後一臉期待地點進去發現,我**都**了,你就給我看這個??
所以這個演算法估計是在更底層實現的,已經不是java這層關心的事情的,那就先跳過吧,知道這裡是個雜湊演算法就行了。然後我們回過頭來看看key的雜湊值有了,那麼怎麼把value的值放到HashMap裡面呢?點進putVal()裡面:
到這裡就能先畫個圖了,首先這是個陣列tab,然後陣列tab裡面裝的Node是連結串列。就這醬紫啦!
【未完待續...】
相關文章
- jdk1.8原始碼解析:HashMap底層資料結構之連結串列轉紅黑樹的具體時機JDK原始碼HashMap資料結構
- Redis原始碼分析-底層資料結構盤點Redis原始碼資料結構
- 深度解析HashMap底層實現架構HashMap架構
- Vector底層結構和程式碼解析
- ArrayList底層結構和原始碼分析原始碼
- Redis - 底層資料結構Redis資料結構
- 深度解析HashMap集合底層原理HashMap
- 【redis】-- 資料結構及底層編碼篇Redis資料結構
- ThreadLocal底層原始碼解析thread原始碼
- 【Mysql】索引底層資料結構MySql索引資料結構
- HashMap的底層結構、原理、擴容機制HashMap
- Redis的ZSet底層資料結構,ZSet型別全面解析Redis資料結構型別
- Redis 概念以及底層資料結構Redis資料結構
- Redis基本資料型別底層資料結構Redis資料型別資料結構
- 深入瞭解Redis底層資料結構Redis資料結構
- Redis(二)--- Redis的底層資料結構Redis資料結構
- Java 的 ArrayList 的底層資料結構Java資料結構
- Redis底層資料結構——壓縮列表Redis資料結構
- 資料結構學習系列之從原始碼來看HashMap資料結構原始碼HashMap
- HashMap原理(一) 概念和底層架構HashMap架構
- Java——HashMap原始碼解析JavaHashMap原始碼
- Redis資料結構SortedSet底層原理詳解Redis資料結構
- 深入理解MySQL索引底層資料結構MySql索引資料結構
- Redis - 資料型別對映底層結構Redis資料型別
- HashMap原理底層剖析HashMap
- HashMap的底層原理HashMap
- 持久層Mybatis3底層原始碼分析,原理解析MyBatisS3原始碼
- spring原始碼解析 (七) 事務底層原始碼實現Spring原始碼
- 筆記-runtime原始碼解析之讓你徹底瞭解底層原始碼筆記原始碼
- HashMap原始碼分析(二):看完徹底瞭解HashMapHashMap原始碼
- Redis List 底層三種資料結構原理剖析Redis資料結構
- HashMap底層實現原理HashMap
- HashMap的底層原理分析HashMap
- Java集合類,從原始碼解析底層實現原理Java原始碼
- Redis學習筆記(二)redis 底層資料結構Redis筆記資料結構
- 關於資料連結底層
- HasMap 底層原始碼分析ASM原始碼
- HashMap原始碼解析(java1.8.0)HashMap原始碼Java