欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中集合List、Set和Map的入門詳細介紹

 更新時間:2022年01月07日 10:41:48   作者:借我丹青妙筆  
Java集合主要分為三種類型:Set(集)、List(列表)和Map(映射),下面這篇文章主要給大家介紹了關于Java中集合List、Set和Map的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

一、Collection接口

1.1 是集合框架的頂級接口

1.2 是Set和List的父接口

1.3 但不是Map的父接口

二、List集合

2.1介紹

Java的List是非常常用的數(shù)據(jù)類型。List是有序的Collection。Java List一共三個實現(xiàn)類:

2.1.1 ArrayList(數(shù)組)

ArrayList 是最常用的 List 實現(xiàn)類,內(nèi)部是通過數(shù)組實現(xiàn)的,它允許對元素進行快速隨機訪問。數(shù)組的缺點是每個元素之間不能有間隔,當數(shù)組大小不滿足時需要增加存儲能力,就要將已經(jīng)有數(shù)組的數(shù)據(jù)復制到新的存儲空間中(動態(tài)擴容)。當從 ArrayList 的中間位置插入或者刪除元素時,需要對數(shù)組進 行復制、移動、代價比較高。因此,它適合隨機查找和遍歷,不適合插入和刪除。

2.1.2 Vector(數(shù)組實現(xiàn)、線程同步)

Vector 與 ArrayList 一樣,也是通過數(shù)組實現(xiàn)的,不同的是它支持線程的同步,即某一時刻只有一 個線程能夠?qū)?Vector,避免多線程同時寫而引起的不一致性,但實現(xiàn)同步需要很高的花費,因此, 訪問它比訪問 ArrayList 慢。

2.1.3 LinkList(鏈表)

LinkedList 是用鏈表結(jié)構(gòu)存儲數(shù)據(jù)的,很適合數(shù)據(jù)的動態(tài)插入和刪除,隨機訪問和遍歷速度比較慢。另外,他還提供了 List 接口中沒有定義的方法,專門用于操作表頭和表尾元素,可以當作堆棧、隊列和雙向隊列使用。

2.2 List特性

  • 可以存放同一種類型的元素。
  • 內(nèi)部維護元素之間的順序,是有序集合。
  • 元素是可以重復的。

2.3 List常用方法

A:添加功能
boolean add(E e):向集合中添加一個元素
void add(int index, E element):在指定位置添加元素
boolean addAll(Collection<? extends E> c):向集合中添加一個集合的元素。

B:刪除功能
void clear():刪除集合中的所有元素
E remove(int index):根據(jù)指定索引刪除元素,并把刪除的元素返回
boolean remove(Object o):從集合中刪除指定的元素
boolean removeAll(Collection<?> c):從集合中刪除一個指定的集合元素。

C:修改功能
E set(int index, E element):把指定索引位置的元素修改為指定的值,返回修改前的值。

D:獲取功能
E get(int index):獲取指定位置的元素
Iterator iterator():就是用來獲取集合中每一個元素。

E:判斷功能
boolean isEmpty():判斷集合是否為空。
boolean contains(Object o):判斷集合中是否存在指定的元素。
boolean containsAll(Collection<?> c):判斷集合中是否存在指定的一個集合中的元素。

F:長度功能
int size():獲取集合中的元素個數(shù)

G:把集合轉(zhuǎn)換成數(shù)組
Object[] toArray():把集合變成數(shù)組。

點擊訪問List集合詳細介紹

2.4 List總結(jié)

2.4.1內(nèi)部存儲結(jié)構(gòu)區(qū)別:

  • ArrayList、Vector是數(shù)組存儲。LinkedList是**鏈表存儲 (不支持下標遍歷)。

2.4.2 線程安全區(qū)別:

  • ArrayList、LinkedList是線程不安全。Vector是線程安全(但是Vector已過時,雖然它線程安全,但導致增刪改查都慢,屬于犧牲性能,提高安全性)。

三、Set集合

3.1介紹

Set 注重獨一無二的性質(zhì),該體系集合用于存儲無序(存入和取出的順序不一定相同)元素,值不能重復。對象的相等性本質(zhì)是對象 hashCode 值(java 是依據(jù)對象的內(nèi)存地址計算出的此序號)判斷的

3.2 分類

3.2.1 HashSet(Hash表)

哈希表邊存放的是哈希值。HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數(shù)據(jù)也是按照哈希值取得。

總結(jié):元素的哈希值是通過元素的hashcode方法 來獲取的, HashSet首先判斷兩個元素的哈希值,如果哈希值一樣,接著會比較equals方法 如果 equls結(jié)果為true ,HashSet就視為同一個元素。如果equals 為false就不是同一個元素。
哈希值相同equals為false的元素是怎么存儲呢,就是在同樣的哈希值下順延(可以認為哈希值相同的元素放在一個哈希桶中)。也就是哈希一樣的存一列。

3.2.2 TreeSet(二叉樹)

  • TreeSet()是使用二叉樹的原理對新 add()的對象按照指定的順序排序(升序、降序),每增加一個對象都會進行排序,將對象插入的二叉樹指定的位置。
  • Integer 和 String 對象都可以進行默認的 TreeSet 排序,而自定義類的對象是不可以的,自己定義的類必須實現(xiàn) Comparable 接口,并且覆寫相應的 compareTo()函數(shù),才可以正常使用。
  • 在覆寫 compare()函數(shù)時,要返回相應的值才能使 TreeSet 按照一定的規(guī)則來排序
  • 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分別返回負整數(shù)、零或正整數(shù)。

3.2.3 LinkHashSet(HashSet+LinkedHashMap)

對于 LinkedHashSet 而言,它繼承與 HashSet、又基于 LinkedHashMap 來實現(xiàn)的。 LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素,它繼承與 HashSet,其所有的方法 操作上又與 HashSet 相同,因此 LinkedHashSet 的實現(xiàn)上非常簡單,只提供了四個構(gòu)造方法,并通過傳遞一個標識參數(shù),調(diào)用父類的構(gòu)造器,底層構(gòu)造一個 LinkedHashMap 來實現(xiàn),在相關操作上與父類 HashSet 的操作相同,直接調(diào)用父類 HashSet 的方法即可。

四、Map集合

4.1 HashMap(數(shù)組+鏈表+紅黑樹)

HashMap 根據(jù)鍵的 hashCode 值存儲數(shù)據(jù),大多數(shù)情況下可以直接定位到它的值,因而具有很快的訪問速度,但遍歷順序卻是不確定的。 HashMap 最多只允許一條記錄的鍵為 null,允許多條記 錄的值為 null。HashMap 非線程安全,即任一時刻可以有多個線程同時寫 HashMap,可能會導致數(shù)據(jù)的不一致。如果需要滿足線程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有線程安全的能力,或者使用 ConcurrentHashMap。我們用下面這張圖來介紹HashMap 的結(jié)構(gòu)。

4.2 ConcurrentHashMap

4.2.1 Segment段

ConcurrentHashMap 和 HashMap 思路是差不多的,但是因為它支持并發(fā)操作,所以要復雜一 些。整個 ConcurrentHashMap 由一個個 Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會將其描述為分段鎖。注意,行文中,我很多地方用了“槽”來代表一個segment。

4.2.2 線程安全(Segment 繼承ReentrantLock 加鎖)

簡單理解就是,ConcurrentHashMap 是一個 Segment 數(shù)組,Segment 通過繼承 ReentrantLock 來進行加鎖,所以每次需要加鎖的操作鎖住的是一個 segment,這樣只要保證每個 Segment 是線程安全的,也就實現(xiàn)了全局的線程安全。

4.2.3 并行度(默認16)

concurrencyLevel:并行級別、并發(fā)數(shù)、Segment 數(shù),怎么翻譯不重要,理解它。默認是 16, 也就是說 ConcurrentHashMap 有 16 個 Segments,所以理論上,這個時候,最多可以同時支 持 16 個線程并發(fā)寫,只要它們的操作分別分布在不同的 Segment 上。這個值可以在初始化的時候設置為其他值,但是一旦初始化以后,它是不可以擴容的。再具體到每個 Segment 內(nèi)部,其實每個 Segment 很像之前介紹的 HashMap,不過它要保證線程安全,所以處理起來要麻煩些。

4.2.4 Java8實現(xiàn) (引入了紅黑樹)

Java8 對 ConcurrentHashMap 進行了比較大的改動,Java8 也引入了紅黑樹。

4.3 HashTable(線程安全)

Hashtable 是遺留類,很多映射的常用功能與 HashMap 類似,不同的是它承自 Dictionary 類,并且是線程安全的,任一時間只有一個線程能寫 Hashtable,并發(fā)性不如 ConcurrentHashMap,因為 ConcurrentHashMap 引入了分段鎖。Hashtable 不建議在新代碼中使用,不需要線程安全的場合可以用 HashMap 替換,需要線程安全的場合可以用 ConcurrentHashMap 替換。

4.4 TreeMap(可排序)

TreeMap 實現(xiàn) SortedMap 接口,能夠把它保存的記錄根據(jù)鍵排序,默認是按鍵值的升序排序, 也可以指定排序的比較器,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的。如果使用排序的映射,建議使用 TreeMap。 在使用 TreeMap 時,key 必須實現(xiàn) Comparable 接口或者在構(gòu)造 TreeMap 傳入自定義的 Comparator,否則會在運行時拋出 java.lang.ClassCastException 類型的異常。

參考:https://blog.csdn.net/chenssy/article/details/26668941

4.5 LinkHashMap(記錄插入順序)

LinkedHashMap 是 HashMap 的一個子類,保存了記錄的插入順序,在用 Iterator 遍歷LinkedHashMap 時,先得到的記錄肯定是先插入的,也可以在構(gòu)造時帶參數(shù),按照訪問次序排序。

參考 :https://blog.csdn.net/qq_40050586/article/details/105851970

總結(jié)

到此這篇關于Java中集合List、Set和Map的文章就介紹到這了,更多相關Java集合List、Set和Map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java集合定義與用法實例總結(jié)【Set、List與Map】

    Java集合定義與用法實例總結(jié)【Set、List與Map】

    這篇文章主要介紹了Java集合定義與用法,結(jié)合實例形式總結(jié)分析了Java集合中Set、List和Map相關概念、功能、用法及操作注意事項,需要的朋友可以參考下
    2018-08-08
  • hibernate存取json數(shù)據(jù)的代碼分析

    hibernate存取json數(shù)據(jù)的代碼分析

    這篇文章主要介紹了hibernate存取json數(shù)據(jù)的代碼分析,需要的朋友可以參考下
    2017-09-09
  • 使用mtrace追蹤JVM堆外內(nèi)存泄露的方法

    使用mtrace追蹤JVM堆外內(nèi)存泄露的方法

    這篇文章主要給大家介紹了如何使用mtrace追蹤JVM堆外內(nèi)存泄露,文章通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • Java instanceof關鍵字用法詳解及注意事項

    Java instanceof關鍵字用法詳解及注意事項

    instanceof 是 Java 的保留關鍵字。它的作用是測試它左邊的對象是否是它右邊的類的實例,返回 boolean 的數(shù)據(jù)類型。本文重點給大家介紹Java instanceof關鍵字用法詳解及注意事項,需要的朋友參考下吧
    2021-09-09
  • Java中Thread類基本用法詳解

    Java中Thread類基本用法詳解

    Java中的Thread類是用于創(chuàng)建和管理線程的類,Thread類提供了許多方法來管理線程,包括啟動線程、中斷線程、暫停線程等,下面這篇文章主要給大家介紹了關于Java中Thread類基本用法的相關資料,需要的朋友可以參考下
    2023-06-06
  • Java注解Annotation原理及自定義注解代碼實例

    Java注解Annotation原理及自定義注解代碼實例

    這篇文章主要介紹了Java注解Annotation原理及自定義注解代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 使用Maven打包時包含資源文件和源碼到jar的方法

    使用Maven打包時包含資源文件和源碼到jar的方法

    這篇文章主要介紹了使用Maven打包時包含資源文件和源碼到jar的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring整合WebSocket應用示例(上)

    Spring整合WebSocket應用示例(上)

    以下教程是小編在參與開發(fā)公司的一個crm系統(tǒng),整理些相關資料,在該系統(tǒng)中有很多消息推送功能,在其中用到了websocket技術(shù)。下面小編整理分享到腳本之家平臺供大家參考
    2016-04-04
  • Spring中的AutowireCandidateResolver的具體使用詳解

    Spring中的AutowireCandidateResolver的具體使用詳解

    這篇文章主要介紹了Spring中的AutowireCandidateResolver的具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • springboot項目配置context path失效的問題解決

    springboot項目配置context path失效的問題解決

    本文主要介紹了springboot項目配置context path失效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04

最新評論