Java之HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap簡單的區別

一、 HashMap

1)底層實現?
數組+鏈表+紅黑樹(在JDK1.8中如果鏈表長度大于8的時候才轉換為紅黑樹)


2)是否線程安全
不支持線程的同步,線程不安全,如需同步,可用Collections的synchronizedMap方法或者使用ConcurrentHashMap,調用這個對象的方法使HashMap具有同步的能力。


3)插入值操作過程

public synchronized V put(K key, V value) {// Make sure the value is not nullif (value == null) {throw new NullPointerException();}// Makes sure the key is not already in the hashtable.Entry<?,?> tab[] = table;int hash = key.hashCode();int index = (hash & 0x7FFFFFFF) % tab.length;@SuppressWarnings("unchecked")Entry<K,V> entry = (Entry<K,V>)tab[index];for(; entry != null ; entry = entry.next) {if ((entry.hash == hash) && entry.key.equals(key)) {V old = entry.value;entry.value = value;return old;}}addEntry(hash, key, value, index);return null;}


4) 特點
HashMap最多只允許一條記錄的鍵為null,允許多條記錄的值為null,然后和插入效率高,但是插入的數據是無序的插入、刪除和定位元素,HashMap是最好的選擇


5)hashmap什么時候進行擴容
當hashmap中的元素個數超過數組大小loadFactor時,就會進行數組擴容,loadFactor的默認值為0.75,也就是說,默認情況下,數組大小為16那么當hashmap中元素個數超過160.75=12的時候就把數組的大小擴展為2*16=32,即擴大一倍,然后重新計算每個元素在數組中的位置,而這是一個非常消耗性能的操作。

?

?

?

?

?

?

二、 Hashtable


1)底層實現
它繼承自Dictionary類

2)是否線程安全
支持線程的同步,線程安全,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢

?

?

?

?

?

?

?

三、LinkedHashMap


1)底層實現
雙向鏈表+HashMap(LinkedHashMap是繼承于HashMap)


2) 是否支持線程安全
不支持線程的同步,線程不安全


3)特點
保存了記錄的插入順序,也就是數據是有序的,在用Iterator遍歷LinkedHashMap時,先得到的記錄肯定是先插入的, 也可以在構造時用帶參數,按照應用次數排序,一般在遍歷的時候會比HashMap慢,有HashMap的全部特性,不過有種情況例外,當HashMap容量很大,實際數據較少時,遍歷起來可能會比LinkedHashMap慢,因為LinkedHashMap的遍歷速度只和實際數據有關,和容量無關,而HashMap的遍歷速度和他的容量有關。

?

?


四、TreeMap


1)底層實現
紅黑樹


2)是否線程安全
不支持線程的同步,線程不安全


3)特點
TreeMap實現SortMap接口,能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的

?

?

?

?

五、ConcurrentHashMap


1)底層實現
拓展了Hashtable,底層采用分段的數組+鏈表實現


2)是否線程安全
支持線程的同步,線程安全,即任一時刻只有一個線程能寫ConcurrentHashMap。


3)特點
鎖分離技術,段內擴容,ConcurrentHashMap對分開兩次操作也是安全的。
?
?

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

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

相關文章

《零基礎看得懂的C語言入門教程 》——(八)了解基本數組還不是那么簡單

一、學習目標 了解數組的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么難簡單開發帶你了解流程 第…

推導坐標旋轉公式(轉)

在《Flash actionScript 3.0 動畫教程》一書中有一個旋轉公式&#xff1a; x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x&#xff0c;y表示物體相對于旋轉點旋轉angle的角度之前的坐標&#xff0c;x1&#xff0c;y1表示物體旋轉angle后相對于旋轉點的坐標 …

任務管理平臺_jytask一個任務調度統一管理平臺

task介紹和使用https://gitee.com/yuejing/task 下的文檔&#xff1a;[doc/task介紹和使用.docx]task是什么&#xff1f;task是一個任務調度統一管理平臺。 目前主要是通過http來進行任務的調度&#xff0c;http支持簽名算法。一張圖能更加懂它是做什么的(一個集中管理任務的平…

設計一個支持百萬用戶的系統

設計一個支持數百萬用戶的系統是非常有挑戰性的, 這是一個需要不斷調整和優化的過程, 接下來的內容中, 我將構建一個系統, 從單個用戶開始&#xff0c;到最后支持數百萬的用戶。從單個服務開始 千里之行&#xff0c;始于足下&#xff0c;讓我們從最簡單的單個服務開始。所有的…

SQL Server T-SQL編程:數據庫用戶與安全設置

目錄 一、數據庫的注冊、用戶建立 二 、用戶安全設置:角色

原百萬訪問量博客http://blog.chinaunix.net/uid/20656672.html不再維護(10年前數百篇oracle/teradata性能優化、故障處理案例)...

原博客地址http://blog.chinaunix.net/uid/20656672.html不再維護&#xff08;數百篇oracle/teradata性能優化、故障處理原創文章&#xff09;轉載于:https://www.cnblogs.com/zhjh256/p/5497797.html

《零基礎看得懂的C語言入門教程 》——(九)C語言二維數組與循環嵌套

一、學習目標 了解二維數組的使用方法了解循環嵌套的使用方法 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那么…

LRU算法

1 LRU算法 LRU(Least recently used,最近最少使用)根據數據的歷史訪問記錄來進行淘汰數據,思想是“如果數據最近被訪問過,那么將來被訪問的幾率也更高”。 2 具體實現過程 新數據插入到鏈表頭部; 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部; 當鏈表滿…

Scala-2.13.0 安裝及配置

Scala 簡介 Scala 是一門多范式&#xff08;multi-paradigm&#xff09;的編程語言&#xff0c;設計初衷是要集成面向對象編程和函數式編程的各種特性。 Scala 運行在Java虛擬機上&#xff0c;并兼容現有的Java程序。 Scala 源代碼被編譯成Java字節碼&#xff0c;所以它可以運…

檢測python進程是否存活

crontab -e */3 * * * * /data/log_realtime/check.sh > /data/log_realtime/check.log 2>&1 1 0 1 * * /data/jx3log_import_realtime/shutdown.sh 說明&#xff1a;每3分鐘檢查一次進程是否存在&#xff0c;每個月1號0點1分殺掉進程&#xff0c;重啟 check.sh cd …

中科大鏡像源_JETPACK4.4安裝軟件和備份鏡像的方法介紹

一、使用SDK Manager的文件夾安裝Jetson軟件(以NX為例)當JETPACK安裝出現錯誤的時候&#xff0c;可以嘗試下面的安裝辦法&#xff0c;前提是JETPACK4.4完整安裝(即本文第三節的下載已經完成)&#xff0c;并且選擇JETSON NX的相關的下載已經完成。安裝步驟&#xff1a;1、$cd /n…

站在前人的肩膀上重新透視C# SpanT數據結構

先談一下我對Span的看法&#xff0c; Span是指向任意連續內存空間的類型安全、內存安全的視圖&#xff0c;可操作的滑動窗口。Span和Memory都是包裝了可以在pipeline上使用的結構化數據的內存緩沖器,他們被設計用于在pipeline中高效傳遞數據。定語解讀這里面許多定語&#xff0…

集合學習

List集合&#xff1a;ArrayList集合基于動態數組結構&#xff0c;查詢優&#xff0c;LinkedList 基于鏈表結構 數據移動優。是一個有序的隊列集合 set集合&#xff1a;HashSet和TreeSet 。是一個無序不重復集合 Map集合&#xff1a;HashMap和TreeMap。是一個KEY-VALUE映射的集合…

《零基礎看得懂的C語言入門教程 》——(十)C語言的指針原來是這樣

一、學習目標 了解指針的概念了解指針的使用方法了解雙重指針 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xff1a;&#xff08;二&#xff09;C語言沒那…

T-SQL編程基礎之一:變量與基本語句

一個標準的計算機語言,大概要提供的必要主要功能是:變量說明、分支判斷、循環和輸入輸出結果。T-SQL也一樣,具有這些功能,只不過T-SQL的輸入和輸出不是界面,而是表。 完全精確描述一個計算機語言,大概要很厚的書才能做到,好在目前這些書籍的發行也很多,許多書描述的都…

Java之volatile如何保證可見性和指令重排序

1 我們先了解CPU緩存 CPU緩存為了解決CPU運算速度與內存讀寫速度不匹配的問題&#xff0c;因為CPU運算速度要比內存讀寫速度快得多 一次主內存的訪問通常在幾十到幾百個時鐘周期一次L1高速緩存的讀寫只需要1~2個時鐘周期一次L2高速緩存的讀寫也只需要數十個時鐘周期 CPU大多數…

bigpipe提升網站響應速度

2019獨角獸企業重金招聘Python工程師標準>>> 主要思想就是通過異步 發起一次請求&#xff0c;后端不關閉輸出流&#xff0c;多個線程處理各自任務&#xff0c;然后分別發送到客戶端。 https://github.com/4rnold/Demo-Project/tree/master/bigpipe-demohttps://gith…

mysql 添加用戶_mysql創建用戶與授權

一、創建用戶CREATE USER usernamehost IDENTIFIED BY password;說明username&#xff1a;你將創建的用戶名host&#xff1a;指定該用戶在哪個主機上可以登陸&#xff0c;如果是本地用戶可用localhost&#xff0c;如果想讓該用戶可以從任意遠程主機登陸&#xff0c;可以使用通配…

《零基礎看得懂的C語言入門教程 》——(十一)C語言自定義函數真的很簡單

一、學習目標 了解C語言的自定義函數的使用方法了解C語言自定義函數的傳參了解C語言自定義函數的返回值 目錄 C語言真的很難嗎&#xff1f;那是你沒看這張圖&#xff0c;化整為零輕松學習C語言。 第一篇&#xff1a;&#xff08;一&#xff09;脫離學習誤區 第二篇&#xf…

T-SQL編程基礎之二:條件選擇、循環編程

1. 條件判斷以及GOTO語句 條件判斷是計算機語言的重要功能,在T-SQL中,條件判斷的語句是: if 條件 … else … 或者是: if 條件 … 注意寫法和C類似,但條件描述不使用()也可以。如果是在一個條件里執行多條語句,則要構造復合語句,復合語句是在BEGIN…EDN中構造…