Java集合4-3

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接口
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20210107105110892.png?x-oss- process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1a2FuZ18=,size_16,color_FFFFFF,t_70)




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,不可修改
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

相關文章
相關標籤/搜索