Java.集合 框架,接口,常用集合特点比对
框架
接口
Iterable
可迭代接口
獲取迭代器方法(Iterator<T> iterator();),使用該方法進(jìn)行遍歷。
迭代器實(shí)現(xiàn)Iterator接口。
boolean hasNext();
E next();
List 列表(有序允許重復(fù))
列表
是集合,是有序的集合。所以在Collection基礎(chǔ)上增加了 按照位置 操作的方法。
比如:
?Collection 集合 根接口
集合
此集合只是廣義上的集合,就是一堆數(shù)據(jù),就是一個(gè)結(jié)合。比如:一群人,沒有順序,也沒序號(hào),只能判斷有沒有某人,不能獲取第幾個(gè)人。
注意:Collection中是集合的抽象接口,有的實(shí)現(xiàn)可以重復(fù),有的不可以重復(fù)。所以這里就沒法放一下對有序的操作方法,并不代表他的實(shí)現(xiàn)類 都不支持有序,上面的那個(gè)例子只是用來說明問題。
方法:
可以看出,沒法定位到元素的位置的。
?Queue 單向隊(duì)列
隊(duì)列
FIFO的集合,在Collection的基礎(chǔ)上增加了對先進(jìn)先出的操作。
方法:
是集合,也是隊(duì)列。
在Collection和Queue的基礎(chǔ)上,多了對頭和隊(duì)尾的操作函數(shù)。
方法:
Set 無重復(fù)集合
是集合
是不允許重復(fù)元素,且無序(指存取無序)。
只是對:無重復(fù)的集合 抽象, 不對應(yīng)具體的數(shù)據(jù)結(jié)構(gòu)。即:只要輸出的結(jié)合是沒有重復(fù)元素的集合,就可以實(shí)現(xiàn)該接口。
繼承Collection接口,沒有擴(kuò)展方法,只是對方法在意義上做了限制。同樣繼承Collection接口的特征,部分實(shí)現(xiàn)類有序,部分無序。所以這里也沒有針對有序預(yù)留接口方法。
Map 映射集合
映射的集合
Key-Value,Key和Value 都無序,Key不允許重復(fù),重復(fù)則覆蓋映射的Value。
方法:
Map & Collection
Map是映射的集合,每個(gè)Entity都包含:key-value,Entity是一個(gè)集合,從key維度也是一個(gè)集合,從value維度看也是一個(gè)集合。
這三個(gè)集合只不過都是無序的,entity和key的集合不允許重復(fù)(一般用Set),value是可以重復(fù)的(用Collection)。
可見Set和Map是基本數(shù)據(jù)結(jié)構(gòu)抽象概念的更高層應(yīng)用,只是對一組特定數(shù)據(jù)的集合抽象。而這個(gè)抽象的某一個(gè)維度又可能跟上面的某個(gè)集合特征相同。
Set & Map
邏輯上:
Set在邏輯上跟Map沒有關(guān)系,Set是 單個(gè)無重復(fù)元素,且不保證存取順序的集合的抽象。而Map本質(zhì)是key-value映射對的集合。只不過Map的這個(gè)映射對 也 是不允許有重復(fù)key,以及存取順序保證不了的。
實(shí)現(xiàn)上:
?????? Map的實(shí)現(xiàn)是使用數(shù)組和鏈表的組合。鑒于Map的Key也有類似無存取順序,不可以重復(fù)的特點(diǎn),就使用Map的實(shí)現(xiàn)來實(shí)現(xiàn)Set。
抽象類
接口說清楚有什么功能,抽象類是該接口抽象邏輯的實(shí)現(xiàn),并沒有實(shí)際的實(shí)現(xiàn)。
比如:
接口中包括:contains,containsAll
抽象類中:
比如:(紅色的就是依賴的接口)
contains
public boolean contains(Object o) {Iterator<E> it = iterator();if (o==null) {while (it.hasNext())if (it.next()==null)return true;} else {while (it.hasNext())if (o.equals(it.next()))return true;}return false; }containsAll
public boolean containsAll(Collection<?> c) {for (Object e : c)if (!contains(e))return false;return true;}AbstractCollection
Collection接口的抽象類。
AbstractList
List接口的抽象類,繼承AbstractCollection。
列表的抽象實(shí)現(xiàn)。
AbstractQueue
Queue接口的抽象類,繼承AbstractCollection。
隊(duì)列的抽象實(shí)現(xiàn)。
AbstractSequentialList
列表,只能按照順序訪問的列表,不支持隨機(jī)訪問RandomAccess(ArrayList就實(shí)現(xiàn)了該)。,所以遍歷 AbstractSequentialList 的子類,使用 for 循環(huán) get() 的效率要 <= 迭代器遍歷
繼承自AbstractList,并做了約束。
而數(shù)據(jù)結(jié)構(gòu)中的鏈表不就是,只支持順序訪問,不支持隨機(jī)訪問嗎。
AbstractSet
不重復(fù),無序的Set接口的抽象類,繼承AbstractCollection。
AbstractMap
Map的抽象類,只是對Map接口做了抽象實(shí)現(xiàn)。
集合
Vector
定義:
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable實(shí)現(xiàn):
基礎(chǔ)數(shù)據(jù)結(jié)構(gòu):數(shù)組
擴(kuò)容:初始10,可以設(shè)置;超過長度,數(shù)組翻倍,復(fù)制元素。增加的元素?cái)?shù)量也可以設(shè)置。
線程安全:只是在方法維度加了synchronized關(guān)鍵字 和 數(shù)組。
ArrayList
定義:
public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable實(shí)現(xiàn):
數(shù)據(jù)結(jié)構(gòu):數(shù)組
擴(kuò)容:初始空數(shù)組,第一次添加元素?cái)U(kuò)容10個(gè),以后都是當(dāng)前的1.5倍或者當(dāng)前要求的最小空間大小,下次再擴(kuò)容。
線程安全:不安全,沒有做任何線程控制
LinkedList
定義:
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable實(shí)現(xiàn):
數(shù)據(jù)結(jié)構(gòu):不可以隨機(jī)訪問的 雙向鏈表
擴(kuò)容: 直接鏈接到列表尾部即可
線程安全:不安全,沒有做任何線程控制
HashMap
定義:
public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {實(shí)現(xiàn):
數(shù)據(jù)結(jié)構(gòu):數(shù)組+鏈表/樹
擴(kuò)容: 容量占比超過加載因子(默認(rèn)0.75),就做re哈希
線程安全:不安全,沒有做任何線程控制
HashSet
使用HashMap構(gòu)建的Set。
TreeMap
使用二叉樹構(gòu)建的Map
TreeSet
使用二叉樹構(gòu)建的Set
其他接口
接口分類
標(biāo)志接口:就是一個(gè)標(biāo)記,instanceof 來判斷
方法接口:里邊有具體方法
Cloneable
標(biāo)志接口
表明可被克隆接口
調(diào)用Object.clone()接口
Serializable
標(biāo)志接口
表明可被序列號(hào)接口
RandomAccess
標(biāo)記接口
List實(shí)現(xiàn),表明可以該List支持 快速隨機(jī)訪問 策略。
使用 for (int i=0, n=list.size(); i < n; i++) 比for (Iterator i=list.iterator(); i.hasNext(); )這種訪問速度快。
Comparable
compareTo方法來比較二者的大小。
總結(jié)
以上是生活随笔為你收集整理的Java.集合 框架,接口,常用集合特点比对的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS 数组转树状结构
- 下一篇: 【算法】Java版