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