為了賬號安全,請及時綁定郵箱和手機立即綁定

Java 學習之集合類(Collections)

2015.06.10 10:31 14346瀏覽
Collection(集合類)

我們是使用數組來保存數據,但是他的長度一旦創建,就已經確定了,當我們要動態傳入穿值,數組就有些局限了,集合類就孕育而生;
所謂集合,就是來保存,盛裝數據,也可稱為容器類;使用的類 在java.util 包里

集合類的分類

一、Collection(一組對立的元素)
List(有順序)
Set(不能有重復元素)
Queue(保存隊列先進先出的順序)

二、Map鍵值對(key-value)

【Collection & Map 區別】

1、Collection
每個位置只能保存一個元素

2、Map
保存的是鍵值對(key-value),可以通過過key,來找到value

Java 集合類的層次(點擊放大)

圖片描述

層次關系

Interface Iterable
Collection 的父接口,可以使用foreach 進行遍歷,還有迭代器iterator()方法進行遍歷

Collection
最基本的集合接口,代表一組Object 集合

Set
實現Collectiion 接口,不能包含重復的元素

判斷兩個對象是否相同:equals() 方法,新加入的元素和已有元素相比equals都返回false,否則拒絕添加

需要注意的是,Set 底層實現都是Map,Map 的value 為空;

HashSet
使用Hash 算法來存儲元素,具有良好的存取和查找性能;
然后根據元素的Hashcode 值來決定元素在Hashset 的為位置(會重新進行排序)

Hashset 判斷兩個元素是否相同:

1、equals 為true
2、hashcode 相同

LinkedHashSet
和HashSet 一樣,是利用hashCode 來覺得元素的存儲位置,但是使用鏈表維護元素的次序
當遍歷的時候,是按照插入的順序遍歷的

LinkedHashSet 需要維護元素的插入順序,因此性能會略低于HashSet的性能,但是在迭代訪問所有元素是性能會很高(鏈表適合遍歷)

SortedSet
排序,compareTo() 方法進行比較,插入的元素類型需要一樣,否則出現ClassCastException

TreeSet
SortedSet 的實現類,保證元素處于排序狀態

EnumSet
為枚舉類設計的集合類

List
有順序,可重復,因此可以通過索引 來指定位置的集合元素

ArrayList
基于數組的List,封裝了動態增長的Object[] 數組

Vector
和ArrayList 幾乎一樣,比較古老,線程安全

Stack
是Vector 的子類, 的結構(后進先出)

LinkedList
實現List,Deque;實現List,可以進行隊列操作,可以通過索引來隨機訪問集合元素;實現Deque,也可當作雙端隊列,也可當作棧來使用

Queue(隊列)

Queue 內部是隊列的數據結構(先進先出),新插入的元素會在尾部;插入之后,會慢慢向頂部移動;
類似生活中的排隊

PriorityQueue(優先級隊列)
除了實現Queue 接口,PriorityQueue 還對插入的元素進行重新排序(Comparator)

Deque
雙端隊列,Deque 可以從兩端來添加啊,刪除元素,因此,Deque 可以當作隊列使用,也可當作棧來使用

ArrayDeque
基于數組的雙端隊列,和ArrayList 類似,底層都是采用一個動態可分配的Object[] 的數組

LinkedList

Map
保存映射關系 的數據(key-value)
key:不允許重復,即兩個任意的key 通過equals 比較返回總是false
value:存儲方式類似List(可以重復,根據索引來查找)

需要注意的是:Java 中先實現Map,然后通過包裝所有value 為null 來實現Set 集合

HashMap
和Hashset 一樣,利用key 的hashCode 值進行排序;
判斷兩個key 相等,equals() 方法返回true,兩個hashCode 也必須相等

LinkedHashMap
使用雙向鏈表來維護key-value 的次序,該鏈表負責維護Map 的迭代順序,與插入時的順序一樣

HashTable
古老的Map 實現類

Properies
將Map 寫入文件

SortedMap

TreeMap
是一個紅黑樹結構,對key 進行排序(compareTo),
自然排序:默認的排序
定制排序:也可在構造方法中傳入Comparetor 對象,自定義排序

WeakHashMap
"弱引用",可能會被垃圾回收

IdentityHashMap
key 的比對 "=="

EnumMap
枚舉類實現的Map

遍歷的幾種方式
iterator
foreach
listIterator(List 特有的)

總結 Set 的選擇

1、HashSet的性能總是比TreeSet好(特別是最常用的添加、查詢元素等操作),因為TreeSet需要額外的紅黑樹算法來維護集合元素的次序。只有當需要一個保持排序的Set時,才應該使用TreeSet,否則都應該使用HashSet
2、對于普通的插入、刪除操作,LinkedHashSet比HashSet要略慢一點,這是由維護鏈表所帶來的開銷造成的。不過,因為有了鏈表的存在,遍歷LinkedHashSet會更快
3、EnumSet是所有Set實現類中性能最好的,但它只能保存同一個枚舉類的枚舉值作為集合元素
4、HashSet、TreeSet、EnumSet都是"線程不安全"的,通常可以通過Collections工具類的synchronizedSortedSet方法來"包裝"該Set集合。

SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
List 選擇

1、java提供的List就是一個"線性表接口",ArrayList(基于數組的線性表)、LinkedList(基于鏈的線性表)是線性表的兩種典型實現
2、Queue代表了隊列,Deque代表了雙端隊列(既可以作為隊列使用、也可以作為棧使用)
3、因為數組以一塊連續內存來保存所有的數組元素,所以數組在隨機訪問時性能最好。所以的內部以數組作為底層實現的集合在隨機訪問時性能最好。
4、內部以鏈表作為底層實現的集合在執行插入、刪除操作時有很好的性能
5、進行迭代操作時,以鏈表作為底層實現的集合比以數組作為底層實現的集合性能好
6、當要大量的插入,刪除,應當選用LinkedList;當需要快速隨機訪問則選用ArrayList;

Map 的選擇

1、HashMap和Hashtable的效率大致相同,因為它們的實現機制幾乎完全一樣。但HashMap通常比Hashtable要快一點,因為Hashtable需要額外的線程同步控制
2、TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、刪除key-value對時更慢),因為TreeMap底層采用紅黑樹來管理key-value對
3、使用TreeMap的一個好處就是: TreeMap中的key-value對總是處于有序狀態,無須專門進行排序操作
4、HahMap 是利用hashCode 進行查找,而TreeMap 是保持者某種有序狀態
5、所以,插入,刪除,定位操作時,HashMap 是最好的選擇;如果要按照自然排序或者自定義排序,那么就選擇TreeMap

本文作者:Tikitoo
本文出處:github.com/Tikitoo/blog/issues/30

點擊查看更多內容
C
36人點贊

若覺得本文不錯,就分享一下吧!

評論

相關文章推薦

正在加載中
意見反饋 幫助中心 APP下載
官方微信

舉報

0/150
提交
取消
lpl竞猜