云南網(wǎng)站制作案例百度云盤資源共享鏈接群組鏈接
1.什么是集合?
集合就是一個(gè)存放數(shù)據(jù)的容器,準(zhǔn)確的說是放數(shù)據(jù)對(duì)象引用的容器。
集合和數(shù)組的區(qū)別
- 數(shù)組是固定長度,集合是可變長度。
- 數(shù)組可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型,集合只能存儲(chǔ)引用數(shù)據(jù)類型;
- 數(shù)組存儲(chǔ)的元素必須是同一個(gè)數(shù)據(jù)類型,集合存儲(chǔ)的對(duì)象可以是不同的數(shù)據(jù)類型。
使用集合框架的好處
- 容量自增長;
- 提供了高性能的數(shù)據(jù)結(jié)構(gòu)和算法,使得編碼更輕松,提高了程序速度和質(zhì)量;
- 允許不同API之間相互操作,API之間可以來回傳遞集合;
- 可以方便的擴(kuò)展或改寫集合,提高了代碼的復(fù)用性和可操作性;
- 通過使用JDK自帶的集合類,可以降低代碼維護(hù)和學(xué)習(xí)新API的成本;
2.常用的集合類有哪些?
Map接口和Collection接口是所有集合框架的父接口:
- Collection接口的子接口包括:Set接口和List接口,Queue接口;
- Map接口的實(shí)現(xiàn)類主要有:HashMap,TreeMap,HashTable,ConcurrentHashMap;
- Set接口的實(shí)現(xiàn)類主要有:HashSet,TreeSet,LinkedHashSet;
- List接口的實(shí)現(xiàn)類主要有:ArrayList,LinkedList,Stack,Vector;
3.List,Set,Map三者的區(qū)別?
- List:
- 可以允許重復(fù)對(duì)象
- 可以插入多個(gè)null對(duì)象
- 是一個(gè)有序的容器,保持了每個(gè)元素的插入順序,它的輸出順序就是插入順序;
- 常用的實(shí)現(xiàn)類有ArrayList,LinkedList,Vector。
- Set:
- 不允許重復(fù)對(duì)象
- 無序容器,沒法保證每個(gè)元素的存儲(chǔ)順序,TreeSet通過Comparator或者Comparable維護(hù)了一個(gè)排序順序
- 只允許一個(gè)null元素
- 常用的實(shí)現(xiàn)類是HashSet,LinkedHashSet,TreeSet
- Map:
- Map里你可以擁有隨意個(gè)null值,但只能有一個(gè)null鍵
- 常用的是實(shí)現(xiàn)類:HashMap,TreeMap,Hashtable,LinkedHashMap;
4.集合框架底層數(shù)據(jù)結(jié)構(gòu)
List接口
1.ArrayList
- 底層數(shù)據(jù)結(jié)構(gòu):動(dòng)態(tài)數(shù)組
- 特點(diǎn):基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn),數(shù)組在存儲(chǔ)元素時(shí)是連續(xù)的內(nèi)存空間;當(dāng)數(shù)組容量不足時(shí)會(huì)自動(dòng)擴(kuò)容,通常為原容量的1.5倍;隨機(jī)訪問元素時(shí)O(1)的時(shí)間復(fù)雜度,但在插入或者刪除元素時(shí)為O(n);
2.LinkedList
- 底層數(shù)據(jù)結(jié)構(gòu):雙向鏈表
- 特點(diǎn):基于雙向鏈表實(shí)現(xiàn),每個(gè)節(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素以及指向前后節(jié)點(diǎn)的兩個(gè)指針;插入和刪除操作O(1);隨機(jī)訪問O(n),因?yàn)樾枰獜念^或者尾部開始遍歷鏈表;
3.Vector
- 底層數(shù)據(jù)結(jié)構(gòu):動(dòng)態(tài)數(shù)組
- 特點(diǎn):Vector時(shí)線程安全的,每個(gè)方法都被sychronized關(guān)鍵字修飾,因此在多線程環(huán)境下會(huì)出現(xiàn)數(shù)據(jù)不一致的問題;性能比ArrayList較差
- 適用場景:適合多線程環(huán)境中需要頻繁訪問的場景,但由于Vector的性能開銷,一般推薦ArrayList和同步機(jī)制配合使用;
Set接口
1.HashSet
- 底層數(shù)據(jù)結(jié)構(gòu):哈希表
- 特點(diǎn):基于HashMap實(shí)現(xiàn),哈希表使用散列函數(shù)來計(jì)算每個(gè)元素的哈希值,并將元素存儲(chǔ)在相應(yīng)的哈希桶中;HashSet不保證集合的順序,插入,刪除,查找操作的時(shí)間復(fù)雜度為O(1);允許一個(gè)null值;
- 適用場景:需要快速查找,插入,刪除,并且不關(guān)心元素順序的場景
2.LinkedHashSet
- 底層數(shù)據(jù)結(jié)構(gòu):鏈表和哈希表
- 特點(diǎn):繼承自HashSet,但維護(hù)者一個(gè)雙向鏈表以保證插入順序;
3.TreeSet
- 底層數(shù)據(jù)結(jié)構(gòu):紅黑樹(自平衡的二叉搜索樹)
- 特點(diǎn):基于TreeMap實(shí)現(xiàn);元素的順序是根據(jù)提供的比較器來排序的,插入刪除查找操作為O(logn);不允許null值,因?yàn)閚ull無法比較
Map接口
1.HashMap
- 底層數(shù)據(jù)結(jié)構(gòu):哈希表和鏈表/紅黑樹
- 特點(diǎn):基于哈希表實(shí)現(xiàn),使用散列函數(shù)計(jì)算鍵的哈希值并將鍵值對(duì)存儲(chǔ)在相應(yīng)的哈希桶中;當(dāng)哈希沖突發(fā)生時(shí),
HashMap
使用鏈表來存儲(chǔ)沖突的元素。從Java 8開始,當(dāng)鏈表長度超過一定閾值(默認(rèn)8)時(shí),鏈表會(huì)轉(zhuǎn)換為紅黑樹,以提高查找和刪除效率。
2.LinkedHashMap
- 底層數(shù)據(jù)結(jié)構(gòu):鏈表和哈希表
- 特點(diǎn):除了使用哈希表存儲(chǔ)鍵值對(duì)外,還維護(hù)了一個(gè)雙向鏈表來記錄元素的插入順序或訪問順序。
3.TreeMap
- 底層數(shù)據(jù)結(jié)構(gòu):紅黑樹
- 特點(diǎn):底層基于紅黑樹實(shí)現(xiàn),鍵值對(duì)按鍵的自然順序或自定義比較器排序;不允許null鍵;
- 場景:適合需要鍵值對(duì)有序排列和范圍查找的場景。
4.Hashtable
- 底層數(shù)據(jù)結(jié)構(gòu):哈希表
- 特點(diǎn):和
HashMap
類似,但Hashtable
是線程安全的,所有方法都被synchronized
修飾。 - 場景:適合多線程環(huán)境下線程安全的鍵值對(duì)存儲(chǔ)
5.哪些集合類是線程安全的?
- Vector:Vector 是一個(gè)古老的動(dòng)態(tài)數(shù)組實(shí)現(xiàn),所有的方法都被?synchronized?關(guān)鍵字修飾,因此是線程安全的。然而,由于性能較差,不推薦在現(xiàn)代代碼中使用。
- Hashtable:Hashtable 是一個(gè)古老的哈希表實(shí)現(xiàn),也是線程安全的,所有的方法都被?synchronized?關(guān)鍵字修飾。和 Vector 一樣,由于性能原因,現(xiàn)在一般推薦使用 HashMap
- ConcurrentHashMap:ConcurrentHashMap 是 Java 5 及以后版本引入的并發(fā)哈希表實(shí)現(xiàn)。它采用分段鎖機(jī)制,支持高并發(fā)的讀和寫操作,是一個(gè)高性能的線程安全集合類