Java 常用 Collection 繼承關係與介面實現
Java Collection
List 介面
繼承、介面實現關係:
public interface List<E> extends Collection<E>
方法定義:
- 在末尾新增一個元素:
boolean add(E e)
- 在指定索引新增一個元素:
boolean add(int index, E e)
- 刪除指定索引的元素:
E remove(int index)
- 刪除某個元素:
boolean remove(Object e)
- 獲取指定索引的元素:
E get(int index)
- 獲取連結串列大小(包含元素的個數):
int size()
實現:
List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
Map 介面
繼承、介面實現關係:
public interface Map<K,V>
實現:
Map<Integer, Integer> hashMap = new HashMap<>();
(最常用)
SortedMap 介面
繼承、介面實現關係:
public interface SortedMap<K,V> extends Map<K,V>
實現:
-
Map<Integer, Integer> treeMap = new TreeMap<>();
必須實現
Comparable
介面
Set 介面
繼承、介面實現關係:
public interface Set<E> extends Collection<E>
方法定義:
- 將元素新增進
Set<E>
:boolean add(E e)
- 將元素從
Set<E>
刪除:boolean remove(Object e)
- 判斷是否包含元素:
boolean contains(Object e)
實現:
Set<Integer> hashSet = new HashSet<>();
(最常用)
SortedSet 介面
繼承、介面實現關係:
public interface SortedSet<E> extends Set<E>
實現:
-
Set<Integer> treeSet = new TreeSet<>();
必須實現
Comparable
介面
Queue 介面
繼承、介面實現關係:
public interface Queue<E> extends Collection<E>
方法定義:
-
獲取佇列長度:
int size()
-
throw Exception 返回false或null 新增元素到隊尾 add(E e)
boolean offer(E e)
取隊首元素並刪除 E remove()
E poll()
取隊首元素但不刪除 E element()
E peek()
實現:
-
Queue<Integer> queue = new LinkedList<>();
(LinkedList<E>
實現了Deque<E>
介面,Deque<E>
介面繼承於Queue<E>
介面) -
Queue<Integer> priorityQueue = new PriorityQueue<>();
必須實現
Comparable
介面
Deque 介面
繼承、介面實現關係:
public interface Deque<E> extends Queue<E>
方法定義與對比:
Queue | Deque | |
---|---|---|
新增元素到隊尾 | add(E e) / offer(E e) |
addLast(E e) / offerLast(E e) |
取隊首元素並刪除 | E remove() / E poll() |
E removeFirst() / E pollFirst() |
取隊首元素但不刪除 | E element() / E peek() |
E getFirst() / E peekFirst() |
新增元素到隊首 | 無 | addFirst(E e) / offerFirst(E e) |
取隊尾元素並刪除 | 無 | E removeLast() / E pollLast() |
取隊尾元素但不刪除 | 無 | E getLast() / E peekLast() |
實現:
Deque<Integer> deque = new LinkedList<>();
Deque<Integer> arrayDeque = new ArrayDeque<>();
建議:
-
Queue
提供的add()
/offer()
方法在Deque
中也可以使用,但是,使用Deque
,最好不要呼叫offer()
,而是呼叫offerLast()
。
如果直接寫deque.offer()
,我們就需要思考,offer()
實際上是offerLast()
,我們明確地寫上offerLast()
,不需要思考就能一眼看出這是新增到隊尾。
因此,使用Deque
,推薦總是明確呼叫offerLast()
/offerFirst()
或者pollFirst()
/pollLast()
方法。 -
面向抽象程式設計的一個原則:儘量持有介面,而不是具體的實現類。
我們發現LinkedList
真是一個全能選手,它即是List
,又是Queue
,還是Deque
。但是我們在使用的時候,總是用特定的介面來引用它,這是因為持有介面說明程式碼的抽象層次更高,而且介面本身定義的方法代表了特定的用途。
Stack 介面
繼承、介面實現關係:
public class Stack<E> extends Vector<E>
public class Vector<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
方法定義:
- 把元素壓棧:
push(E)
- 把棧頂的元素彈出:
pop(E)
- 取棧頂元素但不彈出:
peek(E)
實現:
通常使用 Deque
作為 Stack
使用。注意只調用 push()
/pop()
/peek()
方法,不要呼叫 addFirst()
/removeFirst()
/peekFirst()
方法,這樣程式碼更加清晰。
參考:
- 集合- 廖雪峰的官方網站
java.util
中關於各集合的原始碼