Java集合4-3
文章目錄
類集結構圖
集合是Java中一些成熟的數據結構的實現
java
1、鏈表和二叉樹思路
(1)鏈表
class Node {
Object data;
Node next;
}
(2)二叉樹
class Node {
Object data;
Node left;
Node right;
}
c#
2、Collection接口
通常不會直接使用Collection接口,而是使用其子接口List和Set,都是存儲單值的集合類,前者能夠重複,後者不能夠重複數組
3、List接口
List的實現類,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期實現,LinkedList是鏈表實現,而其餘是數組的動態擴容實現。安全
1.ArrayList
使用數組進行存儲
線程不安全
數據結構
2.Vector
Vector是同步的,即線程安全,若是不要求線程安全,建議使用ArrayListspa
3.LinkedList
使用的是雙向鏈表的結構
線程
4、Iterator和ListItertor
用來遍歷集合中的元素
快速失敗:好比迭代器遍歷以前有10個元素,迭代到一半的時候元素的數量變成5個。那麼迭代器就懵了,直接出錯給你看
安全失敗:在遍歷以前複製一份,遍歷的是複製的那一份,就算數據被改也不會出現異常。通常不進行特殊的描述指的都是安全失敗
(1)iterator.next()用來將指針下移並return下一個元素
使用remove刪除元素要先找到元素,不然會出錯
(2)ListIterator實際上是Iterator的一個子類,ListIterator能夠有前移操做
3d
5、forEach
加強for循環,最先出如今c#語言中,內部使用迭代器進行遍歷,用於迭代數組和結合(Collection)
指針
6、Set接口
Collection和Set沒有get方法 ,前面說過Set不能包含重複元素,null也只能有一個,模擬數學中集合的概念。若是將可變對象存入Set,則必須很是當心對象
7、HashSet
Set不能重複,HashSet內部的原理實際上是在使用HashMap進行存儲
能夠看到flag1爲true,flag2爲false
8、TreeSet類與Comparable接口
前面的HashSet是散列存儲,這裏的TreeSet採用有序的二叉樹進行存儲,利用TreeMap進行存儲。輸出的順序是數據的順序,而不是輸入的順序
但是畢竟ABCD咱們都知道他們的順序,但是若是是咱們自定義的類型呢,好比下面的Person,哪一個在前面,你本身確定也想不明白,那java說我也想不明,我直接出錯給你看
那麼到底如何解決呢,咱們 須要實現Comparable接口

9、Map 接口
不一樣於Collection的單值存儲,Map存儲的是鍵值對,Map集合的鍵不可重複
1.哈希表
哈希桶中的數量大於8時,鏈表會裝換成二叉樹,更利於查找;當哈希桶中的數量減小到6時,紅黑二叉樹轉換成鏈表。當散列因子達到0.75時對哈希表擴容到2倍
2.HashMap/HashTable/ConcurrentHashMap/TreeMap/LinkedHashMap
以上的基本用法是同樣的,可是輸出的順序可能不一樣,TreeMap和以前的TreeSet同樣,若是是自定義類型須要實現Comparable接口
須要注意的是,不能直接對HashMap進行遍歷,要先用keySet()將其轉化成Set,這裏的set是鍵
或使用values()將其轉化成Collection(),這裏的values是值
3.Map集合各子類區別分析
(1)HashMap
線程不安全,效率高
(2)HashTable
線程安全,效率低
(3)ConcurrentHashMap
採用分段鎖機制保證線程安全,效率又比較高
(4)TreeMap
有序
(5)LinkedHashMap
HashMap加雙向鏈表
4.存儲自定義對象
下面咱們自定義一個Book,顯然下面的代碼是能成功輸出的
但若是咱們對book1的name進行修改,此時就不能經過book1找到相應元素了,緣由是以前咱們是經過name和info計算出的hash值,可是當咱們的name被改變以後計算出的hash值就變了
這裏的book3也找不到是由於,雖然book3確實能找到book1的位置,但不是找到就結束了,系統還會把book3和book1的key和info進行比較,結果不一致就返回null
當自定義類型須要改變時儘可能不要放在key的位置
10、JDK9集合新特性
提供存儲肯定長度的List,不可修改