Java集合4-3

Java集合4-3


類集結構圖

集合是Java中一些成熟的數據結構的實現
在這裏插入圖片描述

一、鏈表和二叉樹思路

(1)鏈表
class Node {
Object data;
Node next;
}
(2)二叉樹
class Node {
Object data;
Node left;
Node right;
}









二、Collection接口

一般不會直接使用Collection接口,而是使用其子接口List和Set,都是存儲單值的集合類,前者可以重複,後者不可以重複

三、List接口

List的實現類,ArrayList(95%)、LinkedList(1%)和Vector(4%),Vector是ArrayList的早期實現,LinkedList是鏈表實現,而其他是數組的動態擴容實現。

1.ArrayList

使用數組進行存儲
線程不安全
在這裏插入圖片描述

2.Vector

Vector是同步的,即線程安全,如果不要求線程安全,建議使用ArrayList

3.LinkedList

使用的是雙向鏈表的結構
在這裏插入圖片描述
在這裏插入圖片描述

四、Iterator和ListItertor

用來遍歷集合中的元素
快速失敗:比如迭代器遍歷之前有10個元素,迭代到一半的時候元素的數量變成5個。那麼迭代器就懵了,直接出錯給你看
安全失敗:在遍歷之前複製一份,遍歷的是複製的那一份,就算數據被改也不會出現異常。一般不進行特殊的描述指的都是安全失敗
(1)iterator.next()用來將指針下移並return下一個元素
在這裏插入圖片描述
使用remove刪除元素要先找到元素,否則會出錯
在這裏插入圖片描述
(2)ListIterator其實是Iterator的一個子類,ListIterator可以有前移操作
在這裏插入圖片描述







五、forEach

增強for循環,最早出現在c#語言中,內部使用迭代器進行遍歷,用於迭代數組和結合(Collection)
在這裏插入圖片描述
在這裏插入圖片描述

六、Set接口

Collection和Set沒有get方法 ,前面說過Set不能包含重複元素,null也只能有一個,模擬數學中集合的概念。如果將可變對象存入Set,則必須非常小心

七、HashSet

Set不能重複,HashSet內部的原理其實是在使用HashMap進行存儲
在這裏插入圖片描述
可以看到flag1爲true,flag2爲false
在這裏插入圖片描述


八、TreeSet類與Comparable接口

前面的HashSet是散列存儲,這裏的TreeSet採用有序的二叉樹進行存儲,利用TreeMap進行存儲。輸出的順序是數據的順序,而不是輸入的順序
在這裏插入圖片描述
可是畢竟ABCD我們都知道他們的順序,可是如果是我們自定義的類型呢,比如下面的Person,哪個在前面,你自己肯定也想不明白,那java說我也想不明,我直接出錯給你看
在這裏插入圖片描述
那麼到底如何解決呢,我們 需要實現Comparable接口
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210107105110892.png?x-oss- process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1a2FuZ18=,size_16,color_FFFFFF,t_70)




九、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的位置





十、JDK9集合新特性

提供存儲確定長度的List,不可修改
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章