JAVA核心基礎篇-集合

想要了解集合,首先要知道一個東西,叫數據結構。所謂數據結構,其實就是計算機存儲,組織數據的方式。

常用的數據結構有8大類

數組,鏈表,樹,堆,棧,隊列,哈希表,圖

在集合中比較常見的是數組鏈表紅黑樹

什么是集合

Java 集合(Collection)是 Java 提供的一套用于存儲和操作多個對象的框架,位于java.util包下。它替代了傳統的數組,提供了更靈活、功能更豐富的數據結構,以及便捷的操作方法。

Java 集合兩大體系CollectionMap

Collection是單列集合單列集合元素存儲方式就是一個個元素存儲

Collection 接口的主要子接口

  1. List:有序、可重復的集合
    List最大的特點就是存儲的元素是有順序的,并且可以存儲重復的元素

    • ArrayList:基于動態數組實現,查詢快,增刪慢
    • LinkedList:基于雙向鏈表實現,增刪快,查詢慢
    • Vector:線程安全的動態數組(古老類,效率較低)
  2. Set:無序、不可重復的集合
    Set最大的特點就是存儲的元素是無順序的,并且不可以存儲重復的元素

    • HashSet:基于哈希表實現,無序,查詢快
    • LinkedHashSet:繼承 HashSet,維護元素插入順序
    • TreeSet:基于紅黑樹實現,元素有序(自然排序或定制排序)
  3. Queue:隊列,通常按 FIFO(先進先出)原則操作

    • LinkedList:可作為隊列使用
    • PriorityQueue:優先級隊列,元素按優先級排序

    Map是雙列集合雙列集合元素存儲方式是以key,value鍵值對的方式進行存儲

    Map 接口的主要實現類

    • HashMap:基于哈希表實現,無序,查詢快
    • LinkedHashMap:繼承 HashMap,維護鍵值對的插入順序
    • TreeMap:基于紅黑樹實現,鍵有序
    • Hashtable:線程安全的哈希表(古老類,效率較低)
    • ConcurrentHashMap:線程安全的 HashMap,并發性能好

    ArrayList和LinkedList和Vector

    ArrayList底層的數據結構是數組,而LinkedList底層的數據結構是鏈表

    Vector支持線程同步,是線程訪問安全的,ArrayList線程不安全 。

    數組的特點就是通過索引來查詢數據,因此查詢數據速度比較快,而因為數組的內存空間是連續性的因此在添加數據和刪除數據的時候,因此效率沒這么快

    鏈表的特點就是內存空間不是連續性的,因此查詢的時候需要遍歷檢索,效率沒這么高,而元素的底層是由prev,元素和next三部分組成的節點。因此在增刪數據的時候只需要把節點的next,斷開原本的prev,然后連接新的prev,因此無需移動元素,效率更高,被斷開的節點會慢慢地被gc回收

    ArrayList動態擴容

    ArrayList默認數組的大小為10,擴容的時候采用的是采用移位運算

    ArrayList的擴容因子為1.5

    ArrayList和LinkedList的使用場景

    在工作中對元素進行增刪操作時使用LinkedList,而進行查詢的操作使用的是ArrayList

    ArrayList底層結構是基于數組,因為數組最大的特點就是有索引作為下標,查詢時比較方便快捷,但在增刪操作時要進行元素位置的移動,因此效率比較慢。

    LinkedList的底層結構基于鏈表,查詢的時候回通過這般搜索的方式進行查找因此效率會比較慢,

    但在增刪操作時只需要將鏈表節點的頭尾指針進行修改即可,因此效率會比較快。

    在ArrayList中訪問元素的最糟糕的時間復雜度是O(1),而在LinkedList中可能就是O(n)了。在ArrayList中增加或者刪除某個元素時候,如果觸發到了擴容機制,那么底層就會調用到System.arraycopy方法,被native修飾,該方法會直接通過內存復制,省去了大量的數組尋址訪問等時間。但是相比于LinkedList而言,在頻繁的修改元素的情況下,選用LinkedList的性能會更加好一點

    如果去學習過jvm的話,應該會對“內存碎片“這個名詞比較熟悉。

    基于數組結構的數據在存儲信息的時候都需要有連續的內存空間,

    所以如果當內存碎片化情況較為嚴重的時候,可能在使用ArrayList的時候會有OOM的異常拋出。

    復制某個ArrayList到另一個ArrayList中去

    • 使用clone()方法,比如ArrayList newArray = oldArray.clone();
    • 使用ArrayList構造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
    • 使用Collection的copy方法。

    fail-fast機制

    在ArrayList設計的時候,其實還包含有了一個modCount參數,

    這個參數需要和expectedModCount 參數一起使用,expectedModCount參數在進行修改的時候會被modCount進行賦值操作,

    當多個線程同時對該集合中的某個元素進行修改之前都會進行expectedModCount 和modCount的比較操作,

    只有當二者相同的時候才會進行修改,兩者不同的時候則會拋出異常。

    COW容器

    jdk1.5之前,由于常用的ArrayList并不具有線程安全的特性,因此在1.5之后的并發包里面出現了CopyOnWrite容器,簡稱為COW。

    通俗的理解是當我們往一個容器添加元素的時候,不直接往當前容器添加,而是先將當前容器進行Copy,復制出一個新的容器,然后新的容器里添加元素,添加完元素之后,再將原容器的引用指向新的容器。

    這樣做的好處是我們可以對CopyOnWrite容器進行并發的讀,而不需要加鎖,因為當前容器不會添加任何元素。

    所以CopyOnWrite容器也是一種讀寫分離的思想,讀和寫不同的容器。

    并發包juc里面的CopyOnWriteArrayList中,核心原理主要是通過加入了ReentrantLock來保證線程安全性,從而解決了ArrayList的線程安全隱患問題。

    集合的選擇建議

    1. 需要有序可重復:選擇ArrayList(查詢多)或LinkedList(增刪多)
    2. 需要無序不可重復:選擇HashSet
    3. 需要排序的集合:選擇TreeSet(元素)或TreeMap(鍵)
    4. 需要鍵值對存儲:選擇HashMap(一般情況)或LinkedHashMap(需順序)
    5. 多線程環境:考慮使用ConcurrentHashMap等線程安全集合

    集合的常用操作

    • 添加元素:add()(Collection)、put()(Map)
    • 刪除元素:remove()
    • 查找元素:contains()
    • 獲取大小:size()
    • 清空集合:clear()
    • 遍歷元素:增強 for 循環、迭代器(Iterator)

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

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

    相關文章

    大模型——深度評測智能體平臺Coze Studio

    深度評測智能體平臺Coze Studio 7 月底字節跳動的 Coze-Studio 正式開源,算是 AI 智能體領域的一個大事件。這個月終于有時間在內網環境進行了部署和評測,希望能為團隊的企業知識庫和 AI 應用建設提供多一個選項。 其實,我們廠的知識庫系統一直是自研的。沒有直接采用市面…

    UE5打包,LoadObject加載不出網格|動畫

    由于筆者UE5加載模型和動畫使用的動態加載(LoadObject),而這些資源(XX001、XX002 等)沒有被任何關卡或藍圖直接引用,在編輯器狀態下是可以正常加載的,但它們在打包時被當作“無用”資源而排除了…

    C 語言標準輸入輸出頭文件stdio.h及其常見用法

    在這篇文章中,我們來詳細聊一聊 C 語言標準輸入輸出頭文件 stdio.h 及其常見用法。1. stdio.h 是什么 stdio.h(Standard Input and Output Header)是 C 標準庫中的一個頭文件,提供了處理標準輸入輸出和一些文件操作的函數聲明。 它…

    Js逆向 拼夕夕anti_content

    前言 本文章中所有內容僅供學習交流使用,不用于其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據接口等均已做脫敏處理,嚴禁用于商業用途和非法用途,否則由此產生的一切后果均與作者無關!本文章未經…

    大模型時代為什么需要向量數據庫?

    這里寫自定義目錄標題1. 向量數據庫2. 向量嵌入3. 特征和向量4. 相似性測量4.1 歐幾里得距離4.2 余弦相似度5. 相似性搜索5.1 K-Means5.2 基于文本嵌入進行意圖匹配6. 問答助手7. 意圖匹配1. 向量數據庫 向量數據庫(Vector Database),也叫矢…

    【Canvas與旗幟】二十角金盤德國旗

    【成圖】【代碼】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>多角金盤德國旗 Draft1</title><style type"text/css&qu…

    Linux軟件編程:總結

    一、Linux系統概述&#xff08;一&#xff09;Linux系統概述&#xff08;二&#xff09;Linux系統簡介1.常見的Linux系統&#xff1f;2.Linux操作系統是操作系統的核心&#xff0c;也成為內核&#xff0c;內核的主要功能&#xff1f;3.shell是操作系統的外殼&#xff0c;主要作…

    【51單片機學習】直流電機驅動(PWM)、AD/DA、紅外遙控(外部中斷)

    一、直流電機驅動&#xff08;PWM&#xff09;1.直流電機介紹步進電機的旋轉速度完全由編碼的通電時間決定的&#xff0c;可以用于精密控制。 舵機內部是一個直流電機加一個控制器&#xff0c;引出三根線&#xff0c;分別是正負極和編碼線&#xff0c;根據輸出電平的時間來控制…

    ComfyUI Portrait Master肖像大師中文版

    本文轉載自&#xff1a;ComfyUI Portrait Master肖像大師中文版 - Hello123工具導航 ** 一、產品定位與技術架構 肖像大師中文版是專為 AI 繪畫工具設計的提示詞生成插件&#xff0c;通過結構化參數控制實現精準人物肖像生成。它基于 ComfyUI 平臺開發&#xff0c;提供 193 國…

    (Redis)內存淘汰策略

    1. 為什么需要內存淘汰策略&#xff1f;Redis 是一個基于內存的高性能數據庫&#xff0c;所有數據都存儲在內存中。優點&#xff1a;讀寫速度極快。缺點&#xff1a;內存有限&#xff0c;存滿之后如果繼續寫入&#xff0c;就必須有一套策略來決定“刪掉誰&#xff0c;留下誰”。…

    Eclipse 里Mybatis的xml的頭部報錯

    需要進行Eclipse 配置 MyBatis 的DTD文件Window -> Preference -> Maven -> 勾選 (download artifact javadoc).

    SpringBoot Web快速入門_從零搭建你的第一個Web應用

    在 Java 企業級開發領域&#xff0c;SpringBoot 以其 “約定優于配置” 的理念徹底革新了傳統 Spring 應用的開發模式。根據 2023 年 JetBrains 開發者調查報告&#xff0c;超 65% 的 Java 開發者將 SpringBoot 選為 Web 開發的首選框架。其優勢顯著&#xff1a;快速啟動&#…

    手持 Mid360 + RealSense 相機 + Jetson Orin 一體平臺

    這篇博客是我們開源的一個項目介紹&#xff0c;包括3D結構件 STP 文件與常見 SLAM 工程在 Arm 設備上編譯手冊等&#xff0c;將 Livox Mid360、Realsense 相機、Nvidia Jetson Orin、定制電池放在了一個手持設備上&#xff0c;同時這個手持設備預留了底部螺紋孔&#xff0c;當你…

    H7-TOOL固件2.31發布,支持250M示波器,支持IAR下載算法加載運行,上位機支持UTF-8編碼,增加多款脫機燒錄芯片支持

    【PC軟件】V2.3.1 1. 脫機燒錄功能更新: - 添加芯片: - 自動填充文件名、Flash地址、Flash大小、SRAM地址和SRAM大小 - FLM算法文件不支持自動填寫文件名&#xff0c;當生成文件后需要手動更新 - 廠商列表欄鼠標右鍵菜單可復制廠商名 - 修復添加芯片排列次序的問題…

    自然語言處理——06 遷移學習(上)

    1 fasttext工具介紹 1.1 介紹 fasttext 是 Facebook AI Research&#xff08;FAIR&#xff09;開發的開源 NLP 工具包&#xff0c;專門用來解決文本相關任務&#xff0c;比如情感分析、文本分類&#xff08;判斷新聞屬于體育/財經等&#xff09;、識別“人名/地名”這類實體&a…

    數據庫MVCC是什么

    問題數據庫MVCC是什么我的回答MVCC&#xff0c;全稱是"多版本并發控制"(Multi-Version Concurrency Control)&#xff0c;是數據庫管理系統中常用的一種并發控制技術。說白了&#xff0c;它就是通過維護數據的多個版本&#xff0c;讓讀操作不會被寫操作阻塞&#xff…

    游戲廣告投放數據分析項目:拆解投放的“流量密碼”

    用數據說話&#xff1a;1441條投放記錄拆解游戲廣告投放的“流量密碼”一、數據概況 & 處理思路 先放一張數據全家福&#xff0c;字段 13 個&#xff0c;樣本 1441 條&#xff0c;缺失值 0&#xff0c;只做了一件事&#xff1a;把“未知大小”“無”等臟數據清洗掉。 impor…

    數據庫服務語句應用

    文章目錄&#x1f31f;數據庫語句應用介紹&#x1f340;數據庫語句分類介紹DDL&#xff08;Data Definition Language&#xff09;數據定義語言DCL&#xff08;Data Control Language&#xff09;數據控制語言DML&#xff08;Data Manipulation Language&#xff09;數據操作語…

    解釋器模式與布爾表達式的C++實現

    詳細探討一下解釋器模式(Interpreter Pattern)以及如何使用它來實現一個簡單的布爾表達式求值器。 第一部分:解釋器模式詳解 1. 模式定義與意圖 解釋器模式是一種行為設計模式,它給定一個語言,定義其文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中…

    ELK 重難點解析以及最佳實踐

    ELK 重難點解析以及最佳實踐 目錄 ELK簡介核心組件詳解使用技巧重難點解析Spring Boot集成具體場景使用最佳實踐 ELK簡介 什么是ELK ELK是一個開源的日志分析平臺&#xff0c;由三個核心組件組成&#xff1a; Elasticsearch: 分布式搜索引擎&#xff0c;用于存儲和檢索日…