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ù)組。
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集合框架之Set和Map詳解
- Java?集合框架掌握?Map?和?Set?的使用(內(nèi)含哈希表源碼解讀及面試??碱})
- Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案
- 深入解讀Java三大集合之map list set的用法
- JAVA中的 map,list,set
- java中Map、Set、List的簡單使用教程(快速入門)
- Java HashSet(散列集),HashMap(散列映射)的簡單介紹
- java的各種集合為什么不安全(List、Set、Map)以及代替方案
- Java數(shù)據(jù)結(jié)構(gòu)之Map與Set專篇講解
相關文章
Java集合定義與用法實例總結(jié)【Set、List與Map】
這篇文章主要介紹了Java集合定義與用法,結(jié)合實例形式總結(jié)分析了Java集合中Set、List和Map相關概念、功能、用法及操作注意事項,需要的朋友可以參考下2018-08-08hibernate存取json數(shù)據(jù)的代碼分析
這篇文章主要介紹了hibernate存取json數(shù)據(jù)的代碼分析,需要的朋友可以參考下2017-09-09Spring中的AutowireCandidateResolver的具體使用詳解
這篇文章主要介紹了Spring中的AutowireCandidateResolver的具體使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04springboot項目配置context path失效的問題解決
本文主要介紹了springboot項目配置context path失效的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04