HashMap的那些事

一、HashMap與HashTable的區別

1.來歷

HashTable是一種鍵值映射的數據結構,自從java發布就存在,而HashMap是jdk1.2后才出現的,雖然說HashTable出現得早且線程安全,但是效率很低已經棄用了,現在HashMap逐漸成為主流

2.底層數據結構不同

HashTable底層使用的是數組?鏈表,而HashMap底層則是數組?鏈表+紅黑樹

3.線程安全性不同

HashTable是線程安全的,這是因為在每個方法中加入了Synchronize用來實現線程同步,在多線程并發的情況下直接用HashTable就可以實現線程安全,HashMap則是線程不安全的。

但是使用HashTable效率太低了,這是因為當線程訪問HashTable的同步方法時,其他線程只有堵塞等待占用線程執行完

而HashMap在多線程環境中使用put方法導致形成環形鏈表從而形成死循環,導致線程不安全

這個時候ConcurrentHashMap使用分段鎖,對不同的數據段使用不同的鎖,可以支持多個線程同時訪問不同數據段,這樣既保證了線程安全性也提高了并發效率

4.key和value是否允許null值

HashTable中key和value都不允許為null,而HashMap可以且只允許一個key值為null,而value允許一個或者多個為null

5.數據初始化與擴容機制不同

HashTable默認容量為11,而HashMap默認容量為16,HashTable擴容時會將容量變為原來的2被加1,而HashMap會將容量變為2倍。HashTable之所以擴容時會將容量變為2倍加1是因為:HashTable采用取模方式計算數組下標,同時盡量為素數或者奇數,目標是減少Hash碰撞讓計算出來的下標更加分散,讓元素均勻分布于數組中的多個位置

二、為啥HashMap要用數組?鏈表?紅黑樹

1.數組:使用數組可以利用key的hash值能夠快速查詢元素

2.鏈表:由于兩個對象調用哈希函數計算哈希碼值一致導致計算數組的索引值相同,這就是hash沖突。通過將索引值相同的元素放在一個鏈表中去解決hash沖突

3.紅黑樹:如果超過8個節點的鏈表就使用紅黑樹來代替鏈表,從而實現查詢性能的提升

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

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

相關文章

Nmap腳本未來的發展趨勢

Nmap腳本技術的發展趨勢和前景 Nmap腳本是一種基于Lua語言開發的腳本,可以擴展Nmap的功能,用于自動化掃描、漏洞檢測、服務探測、設備管理等方面。隨著網絡安全的不斷發展和漏洞的不斷出現,Nmap腳本技術也在不斷發展和壯大。在本文中&#xf…

小米手機鎖屏時間設置為永不休眠_手機不息屏_保持亮屏

環境:打開手機自帶的鎖屏時間設置發現沒有 永不息屏的選項 原因:采用了三星OLED屏幕,所以根據OLED屏幕特性,這個是為了防止燒屏而特意設計的。非OLED機型支持設置“永不” 解決方案1:原生系統是支持永不鎖屏的&#…

Android 13 - Media框架(20)- ACodec(二)

這一節開始我們就來學習 ACodec 的實現 1、創建 ACodec ACodec 是在 MediaCodec 中創建的,這里先貼出創建部分的代碼: mCodec mGetCodecBase(name, owner);if (mCodec NULL) {ALOGE("Getting codec base with name %s (owner%s) failed", n…

ES 如何將國際標準時間格式進行格式化與調整時區

需求,日志收集的時候,時間格式是國際標準時間格式。形如yyyy-MM-ddTHH:mm:ss.SSS。 (2023-12-05T02:45:50.282Z)這個時區也不對,那如何將此類型的時間,進行格式化呢? 本篇文章體統一個案例&…

Other -- ChatGPT 原理

本文為個人理解,幫助小白(本人就是)了解正在創建新時代的 AI 產品,如文中理解有誤歡迎留言。 [參考鏈接--](https://baijiahao.baidu.com/s?id1765556782543603120&wfrspider&forpc) 1. 了解一些基本概念 大語言模型&a…

修改 Ganglia 監控 Grid Report timezone 時區 為 東八區 +8 PRC

Ganglia 監控 Grid Report timezone 默認時區 為 零時區 0 現在要修改為 東八區 8 具體操作如下 modify ganglia-web report timezone 0 --> 8 vim /apps/svr/httpd-2.4.48/htdocs/ganglia/header.php // add timezone GMT8 ini_set(date.timezone, PRC);詳細記錄&#x…

【面試】測試/測開(ING)

63. APP端特有的測試 參考:APP專項測試、APP應用測試 crash和anr的區別 1)網絡測試 2)中斷測試 3)安裝、卸載測試 4)兼容測試 5)性能測試(耗電量、流量、內存、服務器端) 6&#xf…

畫對比折線圖【Python】

出這一期想必是我做某個課程作業遇到了。 由于去各個官網下載對比圖要錢,我還是不想花錢的!真討厭!淺淺水一期。 以下是要做的對比圖的數據: 代碼: from matplotlib import pyplot as plt#設置中文顯示plt.rcParams[…

CSS新手入門筆記整理:CSS浮動布局

文檔流概述 正常文檔流 “文檔流”指元素在頁面中出現的先后順序。正常文檔流,又稱為“普通文檔流”或“普通流”,也就是W3C標準所說的“normal flow”。正常文檔流,將一個頁面從上到下分為一行一行,其中塊元素獨占一行&#xf…

ChatGPT OpenAI API請求限制 嘗試解決

1. OpenAI API請求限制 Retrying langchain.chat_models.openai.ChatOpenAI.completion_with_retry.._completion_with_retry in 4.0 seconds as it raised RateLimitError: Rate limit reached for gpt-3.5-turbo-16k in organization org-U7I2eKpAo6xA7RUa2Nq307ae on reques…

讓內存無處可逃:智能指針[C++11]

智能指針 文章目錄 智能指針前言RAII什么是智能指針智能指針的應用示例 C98的auto_ptr共享型智能指針:shared_ptrshared_ptr的使用初始化獲取原生指針指定刪除器默認刪除器default_delete指定刪除器指定刪除器管理動態數組 shared_ptr的偽實現shared_ptr的注意事項避…

【Docker】進階之路:(五)Docker引擎

【Docker】進階之路:(五)Docker引擎 Docker引擎簡介Docker引擎的組件構成runccontainerd Docker引擎簡介 Docker引擎是用來運行和管理容器的核心部分。Docker首次發布時,Docker 引擎由LXC 和 Docker daemon 兩個核心組件構成。 …

linux驅動開發——內核調試技術

目錄 一、前言 二、內核調試方法 2.1 內核調試概述 2.2 學會分析內核源程序 2.3調試方法介紹 三、內核打印函數 3.1內核鏡像解壓前的串口輸出函數 3.2 內核鏡像解壓后的串口輸出函數 3.3 內核打印函數 四、獲取內核信息 4.1系統請求鍵 4.2 通過/proc 接口 4.3 通過…

算法:有效的括號(入棧出棧)

時間復雜度 O(n) 空間復雜度 O(n∣Σ∣),其中 Σ 表示字符集,本題中字符串只包含 6 種括號 /*** param {string} s* return {boolean}*/ var isValid function(s) {const map {"(":")","{":"}","["…

List截取指定長度(java截取拼接URL)

場景&#xff1a; N多個參數&#xff0c;截取指定個數&#xff0c;拼接URL public static void main(final String[] args) {int count 0;//每頁數量final int pageSize 5;final List<Integer> memberNos ListUtil.toList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13…

python格式化內容

1.字符串格式化: 定義列表 [{"姓名": "張三", "年齡": 18, "性別": "男"}, {"姓名": "里斯李四李斯", "年齡": 18, "性別": "男"}, {"姓名": "斯托夫斯基…

C++知識 抽象基類

抽象基類通常包含至少一個純虛函數&#xff0c;即一個沒有具體實現的虛函數&#xff0c;通過在基類中聲明純虛函數&#xff0c;它強制派生類提供這個函數的具體實現。 通過在類的聲明中使用 virtual 關鍵字和 0 初始化來創建純虛函數&#xff0c;這樣的類就成為抽象基類。以下…

上位機與PLC:ModbusTCP通訊之數據類型轉換

前請提要: 從PLC讀取的數值,不管是讀正負整數還是正負浮點數,讀取過來后都會變成UInt16,也就是Ushort類型 一、ushort(UInt16)轉成 Int32 源代碼方法: //ushort類型轉Int32類型的方法private int ushortToInt32(ushort[] date, int start){//先進行判斷,長度是否正確…

MySQL_6.MySQL常用創建語句

1.數據庫創建,查詢,刪除 (1)創建一個test數據庫 CREATE DATABASE test ; CREATE DATABASE IF NOT EXISTS test; # default character set :默認字符集 CREATE DATABASE IF NOT EXISTS test default character set UTF8; # default collate&#xff1a;默認排序規格 # utf8_g…

前端知識(七)———HTTPS:保護網絡通信安全的關鍵

當談到網絡通信和數據傳輸時&#xff0c;安全性是一個至關重要的問題。在互聯網上&#xff0c;有許多敏感信息需要通過網絡進行傳輸&#xff0c;例如個人身份信息、銀行賬戶信息和商業機密等。為了保護這些信息不被未經授權的人訪問和篡改&#xff0c;HTTPS&#xff08;超文本傳…