那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

對比Java中HashMap的一些異同

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 10:46 ? 次閱讀

1.前言

我們回顧一下之前講到的Redis的字典結構,示意圖如下:

圖片

Redis的字典本質上來說也是數組+鏈表的數據結構,這與Java中HashMap的數據結構很類似。

由上述結構示意圖也能看出,字典dict中維護了一個ht數組,而且只有兩個元素,這兩個元素是其擴容的關鍵點,這個我們后面會講到。

Redis中的哈希對象在以下條件時,使用ziplist編碼,

  • 哈希對象保存的所有鍵值的字符串長度都小于64字節(jié)
  • 哈希對象保存的鍵值對數量小于512個。

否則哈希對象會使用hashtable編碼, 而hashtable則時使用了字典作為底層實現(xiàn)的。

如下redis 哈希對象編碼由ziplist 變成hashtable

圖片

2.增加元素與鍵沖突

當不同的鍵值經過哈希算法與散列算法之后被分配到了同一個哈希表數組的同一個索引上,那么這之后就會有鍵沖突。

Redis 哈希表解決哈希沖突同樣是使用了鏈表地址法。使用哈希節(jié)點的next指針來鏈接同一個哈希表數組索引上的元素。不過Redis會將新添加的哈希節(jié)點加入到鏈表的表頭位置。

如下所示:如果程序要將鍵值對 (k2 , v2 ) 添加到如下的哈希表中,而且計算的書的索引為1,那么和 (k1 v1) 將產生沖突。解決沖突時,會將兩個節(jié)點使用next指針鏈接起來。而且會將新節(jié)點添加到鏈表表頭的位置。

圖片
哈希表1

圖片
鏈表解決hash沖突之后的哈希表

3.rehash 擴容過程

哈希表不斷的增加元素,其元素數量達到一定的比例之后,程序會對哈希表進行相應的擴展。通過執(zhí)行rehash (重新散列)操作完成操作。其步驟如下:

  • 執(zhí)行擴展操作時會將字典中的ht[1] 哈希表大小設置成 第一個大于等于 ht[0] 的 ht[0].used * 2 的 2^n (2的n次冪)
  • 將保存早ht[0] 中的所有的鍵值對 rehash到ht[1] 上, rehash過程中會重新計算哈希值和索引值。
  • 當ht[0]中所有的鍵值對都遷移到ht[1]上時,釋放ht[0], 并將ht[1] 設置成 ht[0], 并在ht[1]上建一個空的哈希表。

將下圖中的字典做rehash操作:

圖片

  1. ht[0].used 是4,4*2 = 8 ,2的3次方8 是第一個大于4 的 2的n次冪。即程序會將ht[1] 的大小設置成8 ,并分配空間,結構示意如下:

圖片

  1. 將ht[0] 上的幾個鍵值對全部都rehash到ht[1] 上面,如下圖:

圖片

  1. 釋放ht[0],并將ht[1] 設置成 ht[0] , 然后為ht[1]分配一個空白的哈希表 如下圖:

圖片

以上是一個rehash的過程示意。

4.漸進式rehash

上面講的是一個rehash的理論過程,redis實際操作時并不會一次將所有的遷移一次性完成。

如果鍵值對數量非常龐大,那么遷移過程必然需要花費一點時間。由此可知,服務器也不可能一次將所有的鍵值對遷移,需要分多次,逐漸將ht[0] 里面的鍵值對遷移到ht[1]中,

其步驟如下:

  • 首先會給ht[1]分配內存空間,此時redis字典擁有兩個哈希表
  • 字典中維護一個rehashidx的計數器,將其值設置為0,表示rehash工作開始
  • 在rehash期間,程序依然可以進行增刪改查的操作,除此之外還會順帶將ht[0]上 rehashidx索引上所有的鍵值對rehash到ht[1]上,rehash的工作完成后會將rehashidx的值加1
  • 隨著字典的操作,ht[0]上的所有鍵值全部都rehash到ht[1]上時,程序會將rehashidx的值設為-1 ,表示rehash操作已經完成

在漸進式rehash的過程中,redis字典依然是可以進行增刪改查的操作, 其中增加元素的時候會將元素直接保存到ht[1]中, 而刪除,查找,更新的操作會在兩個哈希表中進行, 查找時會先在ht[0]中進行查找,然后會在ht[1]中進行查找。以上措施可以保證ht[0]中的元素只會減少,最終變成空表。

總結

Redis字典和Java中的HashMap的相似點和不同。

相似之處:

  1. 鍵值對存儲:Redis 字典和 Java 的 HashMap 都是鍵值對存儲的數據結構,它們可以通過鍵來快速查找對應的值。
  2. 高效的查找:Redis 字典和 Java 的 HashMap 都使用了哈希表來實現(xiàn),因此在查找操作上具有高效性能。
  3. Redis 字典使用的時哈希表作為底層,并且每個字典維護了兩個哈希表,ht[0] 時主要使用的哈希表,而ht[1] 是在rehash過程是才會使用到的表。
  4. 哈希表的底層同樣是使用了數組 + 鏈表的結構, 與Java 中HashMap 相似,只不過Java8 以后增加了紅黑樹,在特定情況下會替換鏈表。

不同之處:

  1. 哈希表增加元素遇到哈希沖突是會將新添加的元素放到鏈表頭,而Java HashMap會將其放到鏈表尾,
  2. 擴容過程中redis的字典是漸進式擴容,擴容期間還是可以進行操作的,而Java的HashMap擴容需要一次性完成。
  3. 存儲方式:Redis 字典是一種基于內存的數據結構,用于在內存中存儲鍵值對。而 Java 的 HashMap 可以在內存中存儲,也可以持久化到磁盤上。
  4. 分布式支持:Redis 是一種分布式數據庫,可以在多臺服務器上進行數據共享和存儲。而 Java 的 HashMap 只能在單個 JVM 中使用。
  5. 數據類型:Redis 字典可以存儲多種數據類型,如字符串、列表、集合等,而 Java 的 HashMap 只能存儲對象類型。
  6. 持久化:Redis 字典可以將數據持久化到磁盤上,以便在重啟后恢復數據。而 Java 的 HashMap 需要自己實現(xiàn)數據的序列化和反序列化來實現(xiàn)持久化。
  7. 并發(fā)性:Redis 字典是線程安全的,可以支持多個客戶端并發(fā)訪問。而 Java 的 HashMap 在多線程環(huán)境下需要進行額外的同步處理才能保證線程安全。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2975

    瀏覽量

    105156
  • 編碼
    +關注

    關注

    6

    文章

    957

    瀏覽量

    54954
  • 字符串
    +關注

    關注

    1

    文章

    585

    瀏覽量

    20604
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40232
  • hashmap
    +關注

    關注

    0

    文章

    14

    瀏覽量

    2306
收藏 人收藏

    評論

    相關推薦

    java集合干貨系列

    而不是數組  數組的長度固定,集合長度可變  數組只能通過下標訪問元素,類型固定,而有的集合可以通過任意類型查找所映射的具體對象。  整理的集合框架思維導圖  個人整理的Java集合框架思維導圖,動態(tài)維護。導出的圖片無法查看備注的一些信息,所以需要源文件的童鞋可以回復郵箱
    發(fā)表于 12-14 15:11

    關于java性能優(yōu)化的一些細節(jié)

    代碼優(yōu)化 ,個很重要的課題。可能有些人覺得沒用,一些細小的地方有什么好修改的,改與不改對于代碼的運行效率有什么影響呢?這個問題我是這么考慮的,就像大海里面的鯨魚樣,它吃條小蝦米有
    發(fā)表于 10-11 09:23

    Java-4 Java的類

    關于JAVA入門的一些簡明教程,還有一些簡單的程序,適合入門PPT。
    發(fā)表于 04-29 11:28 ?0次下載

    JAVA關于this和that的一些知識

    新手在入門 Java 的過程定會踩很多關于 this 的坑,出現(xiàn)問題的本質就是 this 指針的指向和自己想的不樣。筆者在入門學習的過程
    發(fā)表于 09-25 14:55 ?0次下載

    關于Java HashMap的認知

    HashMap詳解 HashMap 和 HashSet 是 Java Collection Framework 的兩個重要成員,其中 HashMap 是 Map 接口的常用實現(xiàn)類,Ha
    發(fā)表于 09-27 16:34 ?0次下載
    關于<b class='flag-5'>Java</b> <b class='flag-5'>HashMap</b>的認知

    java異常處理設計和一些建議

    程序設計在程序設計,進行異常處理是非常關鍵和重要的部分。個程序的異常處理框架的好壞直接影響到整個項目的代碼質量以及后期維護成本和難度。試想下,如果
    發(fā)表于 09-28 11:48 ?0次下載
    <b class='flag-5'>java</b>異常處理設計和<b class='flag-5'>一些</b>建議

    關于java一些基礎知識解析

    j2ee 全稱Java 2 Enterprise Edition,是Java種企業(yè)版,用于企業(yè)級應用開發(fā)。 j2se 全稱Java 2 Standard Edi
    的頭像 發(fā)表于 02-05 14:43 ?4820次閱讀
    關于<b class='flag-5'>java</b>的<b class='flag-5'>一些</b>基礎知識解析

    十個問題帶你了解和掌握java HashMap

    本文檔內容介紹了十個問題帶你了解和掌握java HashMap及源代碼,供參考
    發(fā)表于 03-12 15:41 ?0次下載

    java學習—探秘Java的String、StringBuilder以及StringBuffer

    探秘JavaString、StringBuilder以及StringBuffer 相信String這個類是Java中使用得最頻繁的類之,并且又是各大公司面試喜歡問到的地方,今天就來
    發(fā)表于 03-13 10:58 ?0次下載

    Java一些基礎面試題資料合集免費下載

    本文檔的主要內容詳細介紹的是Java一些基礎面試題資料合集免費下載。目錄,1.Java基礎知識篇 2.Java web基礎知識總結 3.Java
    發(fā)表于 05-10 18:13 ?0次下載
    <b class='flag-5'>Java</b>的<b class='flag-5'>一些</b>基礎面試題資料合集免費下載

    Java代碼的一些技巧分享

    有時候我們?yōu)榱私y(tǒng)管理會把一些變量放到 yml 配置文件
    的頭像 發(fā)表于 03-16 12:05 ?1398次閱讀

    學習linux內核的一些建議

    學習linux內核,這個可不像學門語言,c或者java個月或者3月你就能精通掌握。學習linux內核是需要步循序漸進,掌握正確的l
    發(fā)表于 05-07 15:20 ?643次閱讀
    學習linux內核的<b class='flag-5'>一些</b>建議

    介紹一些大功率IGBT模塊應用一些技術

    PPT主要介紹了大功率IGBT模塊應用一些技術,包括參數解讀、器件選型、驅動技術、保護方法以及失效分析等。
    發(fā)表于 09-05 11:36 ?818次閱讀

    runtime 的一些對比選型和應用

    基于 io-uring 為 Rust 提供異步支持,并在此基礎上研發(fā)通用網關。 本文包括以下內容: 介紹 Rust 異步 Runtime; Monoio 的一些設計精要; Runtime 對比選型與應用。 02 Rust
    的頭像 發(fā)表于 05-26 15:48 ?737次閱讀
    runtime 的<b class='flag-5'>一些</b><b class='flag-5'>對比</b>選型和應用

    java中常用的包有哪些

    Java種面向對象的高級編程語言,它具有平臺無關性和可擴展性。Java中有很多常用的包,這些包提供了豐富的類庫和工具,用于開發(fā)各種類型的應用程序。下面是Java
    的頭像 發(fā)表于 11-22 15:10 ?1580次閱讀
    足球即时比分| 百家乐娱乐城足球盘网| 百家乐官网英皇娱乐场| 百家乐官网是不是有技巧| 百家乐官网在线怎么玩| 阜城县| 永吉县| 石台县| 军事| 噢门百家乐官网玩的技巧| 财富百家乐的玩法技巧和规则| 娱乐城百家乐官网高手| 百家乐官网如何写路| 百家乐官网娱乐城反水| 百家乐官网波音平台导航网| 澳门百家乐官网规律星期娱乐城博彩 | 永利百家乐官网开户| 永利高百家乐官网进不去| 赌百家乐官网澳门| 澳门百家乐官网赌场娱乐网规则 | 百家乐厅| 百家乐游戏方法| 大发888注册送| 利高在线娱乐城| 百家乐官网技巧论坛| 红9百家乐官网的玩法技巧和规则 高尔夫百家乐官网的玩法技巧和规则 | 关于百家乐切入点| 百家乐博彩的玩法技巧和规则| 百家乐真人赌场娱乐网规则| 大发888官方 截图| 刚察县| 利都百家乐官网国际娱乐场开户注册| 网上百家乐真的假的| 威尼斯人娱乐场下载| 博王娱乐| 博彩网百家乐官网中和局| 百家乐官网款| 百家乐明灯| 京城娱乐城| 怎么玩百家乐官网呀| 百家乐赌场网|