從零開始的Java容器學習(一):初窺容器

前言

寫這系列文章是爲了一邊學習一邊總結,初次寫文,若有錯謬歡迎各位批評指正。java

若是沒有特別說明,源碼部分均是JDK1.8數組

容器接口簡介

簡略版容器框架圖

容器框架圖

容器,指用來存放對象的工具。容器主要包括兩種,分別是Collection和Map,Collection用於存放對象,它的實現主要有List和Set,而Map用來存儲鍵值對的映射表。安全

容器類的部分方法

boolean add(E e);//增長元素e
boolean remove(Object o);//刪除元素o
void clear();//刪除全部元素
boolean contains(Object o);//斷定是否包含元素o
boolean isEmpty();//判斷容器是否爲空
int size();//返回容器內包含的元素數量
Object[] toArray();//返回一個包含此集合中全部元素的數組
Iterator<E> iterator();//返回此集合中的元素的迭代器
複製代碼

固然還有其餘的一些方法,由於篇幅問題省略了。併發

下面簡要介紹一下容器框架內的一些重要實現框架

List、Set和Map的主要區別

List是有序列表,可重複。工具

Set是無序集合,不可重複。性能

Map用於存儲鍵值對映射,提供從key到value的映射,key不可重複。學習

List的主要實現類

ArrayList:基於數組實現,無容量限制,在執行插入元素時可能要擴容,在刪除元素時並不會減少容量,在查找元素時要遍歷數組,對於非null的元素採起equals的方式尋找,非線程安全。優缺點:查找快,插入刪除效率低spa

LinkedList:基於雙向鏈表機制,在插入元素時,須建立一個新的Entry對象,並切換相應元素的先後元素的引用;在查找元素時須遍歷鏈表;在刪除鏈表時,找到要刪除的元素而後在鏈表上刪除便可,非線程安全。優缺點:插入刪除快,查找慢線程

Vector:基於 synchronized 實現的線程安全的 ArrayList,但在插入元素時容量擴充的機制和 ArrayList稍有不一樣,並可經過傳入 capacityIncrement 來控制容量的擴充,線程安全

Stack:基於Vector實現,支持 LIFO,線程安全

Set主要實現類

HashSet:基於HashMap實現,無容量限制,非線程安全。

TreeSet:基於TreeMap實現,支持排序(天然排序 或者 根據建立TreeSet 時提供的 Comparator 進行排序),非線程安全。

LinkedHashSet:繼承自HashSet底層是LinkedHashMap,優勢是能夠保證元素順序,即遍歷序和插入序是一致的。

BitSet:位操做的對象,值只有0或1即false和true,其內部維護了一個 long 數組

Map主要實現類

HashMap:基於哈希表實現,底層是數組和鏈表/紅黑樹,是無序的鍵值對集合,非線程安全

HashTable:基於哈希表實現,用鏈表解決衝突,線程安全

LinkedHashMap:在HashMap的基礎上使用環形雙向鏈表保證key的順序,優勢是能夠保持插入的順序和訪問順序(LRU)非線程安全

TreeMap:基於紅黑樹實現,優勢是支持排序非線程安全

ConcurrentHashMap:基於CAS+synchronized的HashMap,底層是數組和鏈表/紅黑樹,線程安全

其餘的一些容器類

CopyOnWrite類容器類:線程安全,適合讀多寫少場景,容許併發讀,無鎖操做因此性能高,寫操做是寫以前將容器複製一份,在新的副本上執行寫操做而後再將原容器引用指向新容器。

Queue:隊列,具體實現有ArrayDeque、PriorityQueue等等。

Collection和Collections的區別

Collection是一個集合接口(集合類的一個頂級接口)。它提供了對集合對象進行基本操做的通用接口方法。Collection接口在Java類庫中有不少具體的實現。Collection接口的意義是爲各類具體的集合提供了最大化的統一操做方式,其直接繼承接口有List與Set。

Collections是一個包裝類(工具類/幫助類)。它包含有各類有關集合操做的靜態多態方法。此類不能實例化,就像一個工具類,用於對集合中元素進行排序、搜索以及線程安全等各類操做,服務於Java的Collection框架。

參考:

喬戈裏面經

這篇文章讓你完全掌握Java集合框架!

相關文章
相關標籤/搜索