最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解Java基礎(chǔ)中的集合框架

 更新時(shí)間:2023年08月26日 14:46:30   投稿:yin  
Java集合框架(Java Collections Framework, JCF)也稱容器,這里可以類比 C++中的 STL,在這里主要對(duì)如下部分進(jìn)行源碼分析,及在面試中常見(jiàn)的問(wèn)題,例如,在阿里面試常問(wèn)到的 HashMap和ConcurrentHashMap原理等等,深入源碼分析是面試中必備的技能

Java集合框架 (Java Collections Framework, JCF) 也稱容器,這里可以類比 C++ 中的 STL,在市面上似乎還沒(méi)能找到一本詳細(xì)介紹的書(shū)籍。在這里主要對(duì)如下部分進(jìn)行源碼分析,及在面試中常見(jiàn)的問(wèn)題。

例如,在阿里面試常問(wèn)到的 HashMap 和 ConcurrentHashMap 原理等等。深入源碼分析是面試中必備的技能,通過(guò)本文的閱讀會(huì)對(duì)集合框架有更深一步的了解。

一、概述

Java集合框架提供了數(shù)據(jù)持有對(duì)象的方式,提供了對(duì)數(shù)據(jù)集合的操作。Java 集合框架位于java.util包下,主要有三個(gè)大類:Collection(接口)Map(接口)、集合工具類

Collection

  • ArrayList線程不同步。默認(rèn)初始容量為 10,當(dāng)數(shù)組大小不足時(shí)容量擴(kuò)大為 1.5 倍。為追求效率,ArrayList 沒(méi)有實(shí)現(xiàn)同步(synchronized),如果需要多個(gè)線程并發(fā)訪問(wèn),用戶可以手動(dòng)同步,也可使用 Vector 替代。
  • LinkedList線程不同步雙向鏈接實(shí)現(xiàn)。LinkedList 同時(shí)實(shí)現(xiàn)了 List 接口和 Deque 接口,也就是說(shuō)它既可以看作一個(gè)順序容器,又可以看作一個(gè)隊(duì)列(Queue),同時(shí)又可以看作一個(gè)棧(Stack)。這樣看來(lái),LinkedList 簡(jiǎn)直就是個(gè)全能冠軍。當(dāng)你需要使用棧或者隊(duì)列時(shí),可以考慮使用 LinkedList,一方面是因?yàn)?Java 官方已經(jīng)聲明不建議使用 Stack 類,更遺憾的是,Java 里根本沒(méi)有一個(gè)叫做 Queue 的類(它是個(gè)接口名字)。關(guān)于?;蜿?duì)列,現(xiàn)在的首選是 ArrayDeque,它有著比 LinkedList(當(dāng)作棧或隊(duì)列使用時(shí))有著更好的性能。
  • Stack and Queue:Java 里有一個(gè)叫做 Stack 的類,卻沒(méi)有叫做 Queue 的類(它是個(gè)接口名字)。當(dāng)需要使用棧時(shí),Java 已不推薦使用 Stack,而是推薦使用更高效的 ArrayDeque;既然 Queue 只是一個(gè)接口,當(dāng)需要使用隊(duì)列時(shí)也就首選 ArrayDeque 了(次選是 LinkedList )。
  • Vector線程同步。默認(rèn)初始容量為 10,當(dāng)數(shù)組大小不足時(shí)容量擴(kuò)大為 2 倍。它的同步是通過(guò)Iterator方法加synchronized實(shí)現(xiàn)的。
  • Stack線程同步。繼承自 Vector,添加了幾個(gè)方法來(lái)完成棧的功能?,F(xiàn)在已經(jīng)不推薦使用 Stack,在棧和隊(duì)列中有限使用 ArrayDeque,其次是 LinkedList。
  • TreeSet線程不同步,內(nèi)部使用NavigableMap操作。默認(rèn)元素 “自然順序” 排列,可以通過(guò)Comparator改變排序。TreeSet 里面有一個(gè) TreeMap(適配器模式)
  • HashSet線程不同步,內(nèi)部使用 HashMap 進(jìn)行數(shù)據(jù)存儲(chǔ),提供的方法基本都是調(diào)用 HashMap 的方法,所以兩者本質(zhì)是一樣的。集合元素可以為 NULL。
  • Set:Set 是一種不包含重復(fù)元素的 Collection,Set 最多只有一個(gè) null 元素。Set 集合通??梢酝ㄟ^(guò) Map 集合通過(guò)適配器模式得到。
  • PriorityQueue:Java 中 PriorityQueue 實(shí)現(xiàn)了 Queue 接口,不允許放入 null 元素;其通過(guò)堆實(shí)現(xiàn),具體說(shuō)是通過(guò)完全二叉樹(shù)(complete binary tree)實(shí)現(xiàn)的小頂堆(任意一個(gè)非葉子節(jié)點(diǎn)的權(quán)值,都不大于其左右子節(jié)點(diǎn)的權(quán)值),也就意味著可以通過(guò)數(shù)組來(lái)作為 PriorityQueue 的底層實(shí)現(xiàn)。
    • 優(yōu)先隊(duì)列的作用是能保證每次取出的元素都是隊(duì)列中權(quán)值最小的(Java 的優(yōu)先隊(duì)列每次取最小元素,C++ 的優(yōu)先隊(duì)列每次取最大元素)。這里牽涉到了大小關(guān)系,元素大小的評(píng)判可以通過(guò)元素本身的自然順序(natural ordering),也可以通過(guò)構(gòu)造時(shí)傳入的比較器(Comparator,類似于 C++ 的仿函數(shù))。
  • NavigableSet:添加了搜索功能,可以對(duì)給定元素進(jìn)行搜索:小于、小于等于、大于、大于等于,放回一個(gè)符合條件的最接近給定元素的 key。
  • EnumSet:線程不同步。內(nèi)部使用 Enum 數(shù)組實(shí)現(xiàn),速度比HashSet快。只能存儲(chǔ)在構(gòu)造函數(shù)傳入的枚舉類的枚舉值。

Map

  • TreeMap:線程不同步,基于紅黑樹(shù)(Red-Black tree)的 NavigableMap 實(shí)現(xiàn),能夠把它保存的記錄根據(jù)鍵排序,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器,當(dāng)用 Iterator 遍歷 TreeMap 時(shí),得到的記錄是排過(guò)序的。
    • TreeMap 底層通過(guò)紅黑樹(shù)(Red-Black tree)實(shí)現(xiàn),也就意味著containsKey(),get(),put(),remove()都有著log(n)的時(shí)間復(fù)雜度。其具體算法實(shí)現(xiàn)參照了《算法導(dǎo)論》。
  • HashTable線程安全,HashMap 的迭代器 (Iterator) 是fail-fast迭代器。HashTable 不能存儲(chǔ) NULL 的 key 和 value。
  • HashMap:線程不同步。根據(jù)keyhashcode進(jìn)行存儲(chǔ),內(nèi)部使用靜態(tài)內(nèi)部類Node的數(shù)組進(jìn)行存儲(chǔ),默認(rèn)初始大小為 16,每次擴(kuò)大一倍。當(dāng)發(fā)生 Hash 沖突時(shí),采用拉鏈法(鏈表)。JDK 1.8中:當(dāng)單個(gè)桶中元素個(gè)數(shù)大于等于8時(shí),鏈表實(shí)現(xiàn)改為紅黑樹(shù)實(shí)現(xiàn);當(dāng)元素個(gè)數(shù)小于6時(shí),變回鏈表實(shí)現(xiàn)。由此來(lái)防止hashCode攻擊。
    • Java HashMap 采用的是沖突鏈表方式。
    • HashMap 是 Hashtable 的輕量級(jí)實(shí)現(xiàn),可以接受為 null 的鍵值 (key) 和值 (value),而 Hashtable 不允許。
  • LinkedHashMap保存了記錄的插入順序,在用 Iterator 遍歷 LinkedHashMap 時(shí),先得到的記錄肯定是先插入的。也可以在構(gòu)造時(shí)用帶參數(shù),按照應(yīng)用次數(shù)排序。在遍歷的時(shí)候會(huì)比 HashMap 慢,不過(guò)有種情況例外,當(dāng) HashMap 容量很大,實(shí)際數(shù)據(jù)較少時(shí),遍歷起來(lái)可能會(huì)比 LinkedHashMap 慢,因?yàn)?LinkedHashMap 的遍歷速度只和實(shí)際數(shù)據(jù)有關(guān),和容量無(wú)關(guān),而 HashMap 的遍歷速度和他的容量有關(guān)。
  • WeakHashMap:從名字可以看出它是某種 Map。它的特殊之處在于 WeakHashMap 里的 entry 可能會(huì)被 GC 自動(dòng)刪除,即使程序員沒(méi)有調(diào)用remove()或者clear()方法。 WeakHashMap 的存儲(chǔ)結(jié)構(gòu)類似于HashMap
    • 既然有 WeekHashMap,是否有 WeekHashSet 呢?答案是沒(méi)有!不過(guò) Java Collections 工具類給出了解決方案,Collections.newSetFromMap(Map<E,Boolean> map)方法可以將任何 Map包裝成一個(gè)Set。

集合工具類

  • Collections、Arrays:集合類的一個(gè)工具類幫助類,其中提供了一系列靜態(tài)方法,用于對(duì)集合中元素進(jìn)行排序、搜索以及線程安全等各種操作。

  • Comparable、Comparator:一般是用于對(duì)象的比較來(lái)實(shí)現(xiàn)排序,兩者略有區(qū)別。

    • 類設(shè)計(jì)者沒(méi)有考慮到比較問(wèn)題而沒(méi)有實(shí)現(xiàn) Comparable 接口。這是我們就可以通過(guò)使用 Comparator,這種情況下,我們是不需要改變對(duì)象的。
    • 一個(gè)集合中,我們可能需要有多重的排序標(biāo)準(zhǔn),這時(shí)候如果使用 Comparable 就有些捉襟見(jiàn)肘了,可以自己繼承 Comparator 提供多種標(biāo)準(zhǔn)的比較器進(jìn)行排序。

說(shuō)明:線程不同步的時(shí)候可以通過(guò),Collections.synchronizedList() 方法來(lái)包裝一個(gè)線程同步方法

通用實(shí)現(xiàn)

Implementations
Hash TableResizable ArrayBalanced TreeLinked ListHash Table + Linked List
InterfacesSetHashSetTreeSetLinkedHashSet
ListArrayListLinkedList
DequeArrayDequeLinkedList
MapHashMapTreeMapLinkedHashMap

到此這篇關(guān)于深入理解Java基礎(chǔ)中的集合框架的文章就介紹到這了,更多相關(guān)Java集合框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Elasticsearch中store field與non-store field的區(qū)別說(shuō)明

    Elasticsearch中store field與non-store field的區(qū)別說(shuō)明

    這篇文章主要介紹了Elasticsearch中store field與non-store field的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot事務(wù)失效的八大原因及解決方案

    SpringBoot事務(wù)失效的八大原因及解決方案

    在 Spring Boot 項(xiàng)目開(kāi)發(fā)中,聲明式事務(wù)管理通過(guò) @Transactional 注解提供了極大的便利,但許多開(kāi)發(fā)者都曾遇到過(guò)事務(wù)不生效的困擾,本文將詳細(xì)分析導(dǎo)致 Spring Boot 事務(wù)失效的八大常見(jiàn)情況,并提供相應(yīng)的解決方案,需要的朋友可以參考下
    2025-09-09
  • 深入了解java NIO之Selector(選擇器)

    深入了解java NIO之Selector(選擇器)

    這篇文章主要介紹了java NIO之Selector(選擇器)的相關(guān)資料,文中講解非常詳細(xì),實(shí)例代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • Java開(kāi)發(fā)深入分析講解二叉樹(shù)的遞歸和非遞歸遍歷方法

    Java開(kāi)發(fā)深入分析講解二叉樹(shù)的遞歸和非遞歸遍歷方法

    樹(shù)是一種重要的非線性數(shù)據(jù)結(jié)構(gòu),直觀地看,它是數(shù)據(jù)元素(在樹(shù)中稱為結(jié)點(diǎn))按分支關(guān)系組織起來(lái)的結(jié)構(gòu),很象自然界中的樹(shù)那樣。樹(shù)結(jié)構(gòu)在客觀世界中廣泛存在,如人類社會(huì)的族譜和各種社會(huì)組織機(jī)構(gòu)都可用樹(shù)形象表示,本篇介紹二叉樹(shù)的遞歸與非遞歸遍歷的方法
    2022-05-05
  • Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    Spring Boot 中啟用定時(shí)任務(wù)的操作方法

    文章主要介紹了如何在Spring Boot中啟用定時(shí)任務(wù),包括使用@EnableScheduling注解、配置項(xiàng)控制定時(shí)任務(wù)是否開(kāi)啟以及如何關(guān)閉cron定時(shí)任務(wù),感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java利用jacob將word轉(zhuǎn)pdf

    java利用jacob將word轉(zhuǎn)pdf

    這篇文章主要為大家詳細(xì)介紹了java利用jacob將word轉(zhuǎn)pdf,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例

    SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot自動(dòng)裝配注解的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • springboot創(chuàng)建線程池的兩種方式小結(jié)

    springboot創(chuàng)建線程池的兩種方式小結(jié)

    這篇文章主要介紹了springboot創(chuàng)建線程池的兩種方式小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java利用DOM解析XML的學(xué)習(xí)指南

    Java利用DOM解析XML的學(xué)習(xí)指南

    在Java中使用DOM解析XML文件是一個(gè)常見(jiàn)的操作,它允許你以編程方式讀取、修改和保存XML文檔的結(jié)構(gòu)和內(nèi)容,本文為大家介紹了具體的實(shí)現(xiàn)步驟,有需要的小伙伴可以參考下
    2025-04-04
  • RabbitMQ之死信隊(duì)列深入解析

    RabbitMQ之死信隊(duì)列深入解析

    這篇文章主要介紹了RabbitMQ之死信隊(duì)列深入解析,?死信,顧名思義就是無(wú)法被消費(fèi)的消息,字面意思可以這樣理解,一般來(lái)說(shuō),producer將消息投遞到 broker 或者直接到 queue 里了,consumer 從 queue 取消息進(jìn)行消費(fèi),需要的朋友可以參考下
    2023-09-09

最新評(píng)論

义乌市| 清河县| 中阳县| 昌宁县| 鲁山县| 长乐市| 武陟县| 新密市| 洪湖市| 银川市| 漳平市| 通道| 梅州市| 宜章县| 德江县| 田东县| 图木舒克市| 合江县| 阿城市| 即墨市| 德格县| 惠安县| 昌乐县| 山西省| 成安县| 贡觉县| 乃东县| 罗山县| 双桥区| 彭泽县| 镇安县| 驻马店市| 普洱| 教育| 理塘县| 樟树市| 九龙坡区| 卫辉市| 青州市| 甘泉县| 宿迁市|