日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java基础】HashMap原理详解

發布時間:2024/10/8 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java基础】HashMap原理详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【Java基礎】HashMap原理詳解

  • HashMap的實現
    • 1. 數組
    • 2.線性鏈表
    • 3.紅黑樹
      • 3.1概述
      • 3.2性質
    • 4.HashMap擴容死鎖
    • 5. BATJ一線大廠技術棧

HashMap的實現

  • ConcurrentHashMap從JDK1.5開始隨著java.util.concurrent包一起引入JDK,主要為了解決HashMap線程不安全,和HashTable效率不高的問題
  • HashMap在多線程編程中是線程不安全的,而HashTable使用Synchronized修飾方法而效率低
  • ConcurrentHashMap是一個在多線程環境下,線程安全且高性能的HashMap解決方案
  • 底層實現:數組+鏈表+紅黑樹(since JDK1.8)
@Testpublic void test() {ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();map.put(1, "a");map.put(2, "b");map.put(3, "c");Set<Map.Entry<Integer, String>> entrySet = map.entrySet();for (Map.Entry<Integer, String> entry : entrySet) {Integer key = entry.getKey();String value = entry.getValue();System.out.println(key + " " + value);}System.out.println(map.get(1));}

1. 數組

  • 使用一段連續存儲單元存儲數據,對于指定下標的查找,時間復雜度為O(1),對于一般的插入刪除操作,涉及數組元素的移動,其平均時間復雜度為O(n)
  • 通過Object.hashCode()方法得到固定長度哈希值,然后對數組長度取余,得到Object在數組中的坐標
  • 默認初始化長度:16,數組長度一定是2的倍數

2.線性鏈表

  • 對于鏈表的新增、刪除操作,在查找到操作位置后,只需要處理結點間的引用即可,時間復雜度為O(1)
  • 查找操作需要遍歷鏈表的所有結點,復雜度為O(n)
  • 解決哈希沖突,避免數據被覆蓋

3.紅黑樹

3.1概述

  • 當哈希沖突嚴重時,鏈表冗長導致效率低下
  • 紅黑樹是一種接近平衡的二叉搜索樹,在每個結點上增加一個存儲位表示結點的顏色,可以是Red或Black。
  • 通過對任何一條從根到葉子的路徑上,由于各個結點著色方式的限制,紅黑樹確保沒有一條路徑會比其他路徑長出兩倍,因此接近平衡。
  • 支持查找、插入、刪除等操作,平均時間復雜度為O(logn)

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-NnWwAoYR-1589878270141)(Untitled.png)]

3.2性質

  • 每個結點要么是紅的,要么是黑的
  • 根結點是黑的
  • 葉結點都是黑的
  • 如果一個結點是紅的,那么兩個兒子都是黑的
  • 對于任意結點而言,到葉結點的每條路徑都包含相同數目的黑結點

4.HashMap擴容死鎖

  • 擴容因子:0.75
  • 鏈表轉紅黑樹時,鏈表長度為8
import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger;public class DevThread implements Runnable {private static Map<Integer, Integer> map = new HashMap<>();private static AtomicInteger atomicInteger = new AtomicInteger();@Overridepublic void run() {while (atomicInteger.get() < 1000 * 1000) {map.put(atomicInteger.get(), atomicInteger.get());atomicInteger.incrementAndGet();}} }public class MapDeadLock {public static void main(String[] args) {for (int i = 0; i <10 ; i++) {new Thread(new DevThread()).start();}} }

5. BATJ一線大廠技術棧

  • 分布式架構
  • 微服務架構
  • 源碼分析
  • 并發編程
  • 性能優化
  • 數據結構與算法
  • 高并發實戰
  • 工程化協作

總結

以上是生活随笔為你收集整理的【Java基础】HashMap原理详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。