java中常用集合(邊補充)

java中開發常用集合(邊補充)

  • 一、單列集合Collection
    • 1.1List接口
      • 1.1.1 ArrayList
      • 1.1.2 LinkedList
      • 1.1.3 Vector(線程安全)
      • 1.1.4 CopyOnWriteArrayList(線程安全)
    • 1.2 Set接口
      • 1.2.1 HashSet
      • 1.2.2 LinkedHashSet
      • 1.2.3 CopyOnWriteArraySet
  • 二、雙列集合Map
    • 2.1 hashMap
    • 2.2 hashTable(線程安全)
    • 2.3 LinkedHashMap
    • 2.4 ConcurrentHashMap(線程安全)
    • 2.5 TreeMap

一、單列集合Collection

主要使用的是List和Set集合

1.1List接口

主要包括ArrayList、LinkedList、Vector(線程安全)、CopyOnWriteArrayList(線程安全)

1.1.1 ArrayList

ArrayList是線程不安全的,底層數據結構是可變數組,查詢快,增刪慢。
如果有參數擴容1.5倍;如果沒參數第一次擴容為10,第二次滿了擴容為1.5倍 擴容使用的是Arrays.copyOf()

1.1.2 LinkedList

LinkedList底層維護了一個雙向鏈表,沒有實現同步是線程不安全的底層數據結構是鏈表,查詢慢,增刪快。

1.1.3 Vector(線程安全)

Vector是線程同步的,即線程安全的,該類方法帶有synchronized,類似ArrayList,效率不如ArrayList
如果是無參 第一次擴容為10,第二次滿了擴容為2倍;如果指定大小,則每次按照兩倍擴容
Stack繼承Vector,也是線程安全的,支持push、pop、peek等操作

1.1.4 CopyOnWriteArrayList(線程安全)

(1)首先CopyOnWriteArrayList內部也是通過數組來實現的,在向CopyOnWriteArrayList中添加元素時,會復制一個新的數組,寫操作在新數組上進行,讀操作在原數組上進行
(2)并且,寫操作會加鎖,防止出現并發寫入丟失數據的問題
(3)寫操作結束后會把原數組指向新數組
(4)CopyOnWriteArrayList允許在寫操作時來讀取數據,大大提高了讀的性能,因此適合讀多寫少的應用場景,但是CopyOnWriteArrayList會比較占用內存,同時可能讀到的數據不是實時最新的數據,所以不適合實時性要求很高的場景

應用場景 (1)讀多寫少的場景:CopyOnWriteArrayList的讀操作不需要加鎖,因此非常適合在讀多寫少的場景中使用
(2)不需要實時更新的數據:CopyOnWriteArrayList讀取的數據可能不是最新的,因此他適合于不需要實時更新的數據

1.2 Set接口

主要包括HashSet、LinkedHashSet、CopyOnWriteArraySet
主要特點:
1)無序(添加和取出的順序不一致),取出的順序雖然不是添加的順序,但是它的順序是固定的。
2)不允許有重復元素;可以存放null,最多包含一個null,重復add返回false
3)沒有索引,故不能使用索引的方法來獲取元素

1.2.1 HashSet

實現了set接口,本質上底層是一個HashMap
主要是hashCode和equals方法

HashSet底層數據結構是哈希表,因此具有很好的存取和查找性能。
哈希表:一個元素為鏈表的數組,綜合了鏈表(存儲速度快)和數組(查詢速度快)的優點。
1)使用HashSet添加一個元素時,會先得到hash值,然后轉成—>索引值
2)找到存儲數據表table,看這個索引位置是否已經存放的有元素。
3)沒有則直接加入,如果有,則調用equals方法進行比較
4)在Java8中,如果一條鏈表的元素個數達到TREEIFY_THRESHOLD (默認是8),并且table的大小 >= MIN_TREEIFY_CAPACITY (默認是64),就會進行樹化(紅黑樹),這樣又大大提高了查找的效率。

1.2.2 LinkedHashSet

1)在LinkedHashSet中維護了一個hash表和雙向鏈表(LinkedHashSet有head和tail)
2)每一個節點有before和after屬性,這樣可以形成雙向鏈表
3)在添加一個元素時,先求hash值,再求索引,確定該元素在table的位置,然后將添加的元素加入到雙向鏈表
4)遍歷LinkedHashSet,插入順序和遍歷順序一致

1.2.3 CopyOnWriteArraySet

每次調用CopyOnWriteArraySet的add方法的時候,其底層是基于CopyOnWriteArrayList的addIfAbsent方法的,
每次在addIfAbsent方法中都要對數組進行遍歷,所以CopyOnWriteArraySet的性能低于CopyOnWriteArrayList

public class CopyOnWriteArraySet<E> extends AbstractSet<E>
//CopyOnWriteArraySet底層是基于CopyOnWriteArrayList的private final CopyOnWriteArrayList<E> al;
//add方法底層調用的還是CopyOnWriteArrayList的addIfAbsent方法public boolean add(E e) {return al.addIfAbsent(e);}

二、雙列集合Map

特點:

鍵值對映射關系

一個鍵對應一個值

鍵不能重復,值可以重復

元素存取無序

集合的遍歷(待補充代碼)

方法一:
1. 獲取所有鍵的集合。用keySet()方法實現
2. 遍歷鍵的集合,獲取到每一個鍵。用增強for實現  
3. 根據鍵去找值。用get(Object key)方法實現方法二:
1. 獲取所有鍵值對對象的集合:Set<Map.Entry<K,V>> entrySet()
2. 遍歷鍵值對對象的集合,得到每一個鍵值對對象:用增強for實現,得到每一個Map.Entry
3. 根據鍵值對對象獲取鍵和值:用getKey()得到鍵;用getValue()得到值

2.1 hashMap

HashMap首先還是會創建一個默認長度為16,默認加載因子為0.75的數組;
然后再利用put方式,就可以添加數據了,put方法的底層會先創建一個Entry對象,Entry對象里面記錄的就是要添加的鍵和值,然后利用鍵來計算哈希值,跟值無關,然后再計算出元素在數組中應存儲的位置的索引,如果該位置為null,直接添加,如果該位置不為null,它會調用equals方法比較鍵的屬性值,如果鍵的值相同,那么元素就會被覆蓋;如果比較完后不一樣,則會添加新的Entry對象;
JDK8,如果計算出來的索引相同,且鍵不一致,那么就會直接掛在當前值的下面;
此外,當鏈表長度超過8,且數組長度大于等于64的時候,鏈表就會自動轉成紅黑樹
如果鍵存儲的是自定義對象需要重寫hashCode和equals方法,值存儲不需要重寫

2.2 hashTable(線程安全)

HashTable線程安全 (他的每一個方法都加了鎖,適用于多線程并發的環境)
HashTable默認的初始大小為11 每次擴充為2n+1 加載因子0.75

2.3 LinkedHashMap

雙向鏈表
由鍵決定:
有序、不重復、無素引。
有序:保證存儲和取出的順序一致
原理:底層數據結構是依然哈希表,只是每個鍵值對元素又額外的多了一個雙鏈表的機制記錄存儲的順序

2.4 ConcurrentHashMap(線程安全)

可以理解為hashMap的升級版本,在ConcurrentHashMap中,無論是讀操作還是寫操作都能保證很高的性能:在進行讀操作時(幾乎)不需要加鎖,而在寫操作時通過鎖分段技術只對所操作的段加鎖而不影響客戶端對其它段的訪問。特別地,在理想狀態下,ConcurrentHashMap 可以支持 16 個線程執行并發寫操作(如果并發級別設為16),及任意數量線程的讀操作。
通過鎖分段技術保證并發環境下的寫操作;
通過 HashEntry的不變性、Volatile變量的內存可見性和加鎖重讀機制保證高效、安全的讀操作;
通過不加鎖和加鎖兩種方案控制跨段操作的的安全性。

2.5 TreeMap

TreeMap底層是紅黑樹結構 增刪改查性能較好
不重復 無索引 可排序
依賴自然排序或者比較器排序,對鍵進行排序
如果鍵存儲的是自定義對象,需要實現Comparable接口或者在創建TreeMap對象時候給出比較器排序規則

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

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

相關文章

用戶訂單管理API:輕松管理,購物無憂

在當今數字化時代&#xff0c;電子商務已經成為人們購物的首選方式。與傳統的實體店相比&#xff0c;電商的優勢在于便捷、快速、多樣化等特點&#xff0c;使得更多的消費者選擇了通過網絡購物。而作為電商平臺&#xff0c;如何提供更好的購物體驗&#xff0c;是每個平臺都需要…

企業工程項目管理系統源碼:Java版源碼解析

一、項目概述 鴻鵠工程項目管理系統是基于Spring Cloud、Spring Boot、Mybatis、Vue和ElementUI技術棧&#xff0c;采用前后端分離架構構建的工程管理軟件。它旨在應對企業快速發展中的管理挑戰&#xff0c;提升工程管理效率&#xff0c;減輕工作負擔&#xff0c;加速信息處理…

一次關于k8s的node節點NotReady的故障排查

master現象 分析 kubectl get nodes -A 看了下pod的狀態&#xff0c;好多CrashLoopBackOff kubectl get nodes -o wide 定位到那個具體node的IP地址&#xff0c;登錄對應的IP去查看為什么會這樣 node節點 journalctl -xe -f -u kubelet 查看此節點的 kubelet 服務&#xff…

基于SpringBoot的藏區特產銷售平臺

你好呀&#xff0c;我是計算機學姐碼農小野&#xff01;如果有相關需求&#xff0c;可以私信聯系我。 開發語言&#xff1a; Java 數據庫&#xff1a; MySQL 技術&#xff1a; SpringBoot框架 工具&#xff1a; MyEclipse 系統展示 首頁 個人中心 特產信息管理 訂單管…

華寬通中標長沙市政務共性能力建設項目,助力智慧政務建設新飛躍

在數字化浪潮的推動下&#xff0c;長沙市政府正積極擁抱智慧城市建設&#xff0c;以科技力量提升政務服務效能。華寬通憑借其卓越的技術實力與豐富的項目經驗&#xff0c;成功中標長沙市政務共性能力建設項目&#xff0c;這無疑是對華寬通在智慧城市領域實力的高度認可。 華寬…

huggingface_hub 設置國內鏡像

要設置HuggingFace Hub的國內鏡像&#xff0c;你可以按照以下步驟進行操作&#xff0c;以確保從國內鏡像站點下載Hugging Face模型和數據集。 1. 安裝依賴 首先&#xff0c;確保你已經安裝了huggingface_hub庫。如果沒有&#xff0c;可以通過pip進行安裝&#xff1a; bash復制…

背部筋膜炎最有效的治療方法

背部筋膜炎的引起原因可以歸結為多個方面&#xff0c;以下是詳細的分點表示和歸納&#xff1a; 1、慢性勞損&#xff1a;長時間使用背部&#xff0c;如經常按摩背部&#xff0c;會導致筋膜老化、發炎&#xff0c;進而引發背部筋膜炎。癥狀可能包括背部疼痛、痙攣、肌肉無力感等…

Python 判斷for循環最后一次的6種方法

在Python中&#xff0c;通常我們不會直接判斷for循環是否正在執行最后一次迭代&#xff0c;因為Python的for循環是基于可迭代對象的&#xff0c;它不知道也不關心迭代的內部狀態&#xff08;比如當前是第幾次迭代&#xff09;。但是&#xff0c;我們可以使用一些技巧來間接地實…

uboot環境變量操作命令setenv和saveenv

uboot啟動的時候會將環境變量從flash讀取到DRAM中,使用命令 setenv修改的是DRAM中環境變量,修改以后要使用saveenv命令將修改 后的環境變量保存到flash中,否則的話uboot下一次重啟會繼續使用以前的環境變量值.setenv setenv - set environment variables Usage: setenv seten…

LeetCode.295數據流的中位數詳解

問題描述 中位數是有序整數列表中的中間值。如果列表的大小是偶數&#xff0c;則沒有中間值&#xff0c;中位數是兩個中間值的平均值。 例如 arr [2,3,4] 的中位數是 3 。例如 arr [2,3] 的中位數是 (2 3) / 2 2.5 。 實現 MedianFinder 類: MedianFinder() 初始化 Medi…

Advantest 93000測試機中CLOCK DOMAIN 詳解

愛德萬測試&#xff08;Advantest&#xff09;的V93000系列測試系統是一個高度模塊化和可擴展的平臺&#xff0c;專為復雜和高性能的半導體器件測試而設計&#xff0c;包括系統級芯片&#xff08;SoC&#xff09;、存儲器、射頻&#xff08;RF&#xff09;和混合信號器件等。在…

剪畫小程序:從失業到自媒體:37歲的勇敢轉身!

37歲啦&#xff0c;按說這年紀工作該穩穩當當&#xff0c;家庭也和和美美。可誰能想到&#xff0c;我竟然失業了&#xff01;當時啊&#xff0c;心里頭那叫一個迷茫、焦慮&#xff0c;感覺天都要塌下來了。 可日子還得過呀&#xff0c;總不能就這么被生活給打倒&#xff01;現在…

白敬亭章若楠甜度報表的難哄大師

#白敬亭章若楠&#xff0c;甜度爆表的難哄大師#&#x1f389;&#x1f389;&#x1f389;各位小伙伴們&#xff0c;你們還記得那個讓我們心跳加速、嘴角上揚的CP組合嗎&#xff1f;沒錯&#xff0c;就是白敬亭和章若楠&#xff01;他們可是憑借一部新劇&#xff0c;再次讓我們感…

antd中Select大數據分頁觸底刷新處理優化

平時使用antd中Select的下拉一般就幾十幾百條&#xff0c;這時候直接使用組件模糊查詢就能實現大部分業務場景需求。 今天遇到一個需要模糊查詢并且總量上萬條的下拉框&#xff0c;如果一次性懟上去上萬條&#xff0c;會造成瀏覽器卡頓。所以這邊采用后端分頁&#xff0c;前端…

希喂生骨肉凍干值得入手嗎?拯救瘦弱、增強抵抗力最強主食測評!

希喂生骨肉凍干值得入手嗎&#xff1f;很多小姐妹覺著自家貓咪太瘦了、體質不咋好&#xff0c;換季還敏感、掉毛、不吃東西&#xff0c;聽說生骨肉凍干好吸收、營養好&#xff0c;可以改善體質、拯救瘦弱、增強抵抗力&#xff0c;為了圖省事&#xff0c;開始盲入生骨肉凍干&…

盲盒小程序:線上盲盒發展機遇

盲盒已經成為了當下年輕人的潮玩首選方式。隨著二次元、影視行業的快速發展&#xff0c;給盲盒提供了各種新的發展方向&#xff0c;盲盒商品也在不斷創新&#xff0c;種類豐富多樣。玩家在拆盲盒時隨機獲得某一商品&#xff0c;具有驚喜感和刺激性。 目前&#xff0c;隨著小程…

194.回溯算法:組合總和||(力扣)

代碼解決 class Solution { public:vector<int> res; // 當前組合的臨時存儲vector<vector<int>> result; // 存儲所有符合條件的組合// 回溯函數void backtracing(vector<int>& candidates, int target, int flag, int index, vector<bool>…

怎么優化亞馬遜Listing?看這一篇就夠了!

運營亞馬遜最重要的工作之一就是優化listing&#xff0c;精心優化好亞馬遜標題、五點描述、圖片和關鍵詞才能提高產品的可見性和吸引力&#xff0c;很多小伙伴對于怎么寫出專業的亞馬遜listing還是不知道如何下手&#xff0c;今天為大家分享一套實用的亞馬遜listing優化指南&am…

java 簡單零錢通

目標 面向過程版 代碼 package new_pluse;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner;public class change_common{public static void main(String arg[]){//定義相關變量Scanner scanner new Scanner(System.in);String key&qu…

【深度學習】機器學習基礎

機器學習就是讓機器具備找一個函數的能力 帶有未知的參數的函數稱為模型 通常一個模型的修改&#xff0c;往往來自于對這個問題的理解&#xff0c;即領域知識。 損失函數 平均絕對誤差&#xff08;Mean Absolute Error&#xff0c;MAE&#xff09; 均方誤差&#xff08;Mea…