1. 程式人生 > 其它 >Java 常用 Collection 繼承關係與介面實現

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()

實現:

  1. List<Integer> arrayList = new ArrayList<>();
  2. List<Integer> linkedList = new LinkedList<>();

Map 介面

繼承、介面實現關係:

public interface Map<K,V>

實現:

  1. Map<Integer, Integer> hashMap = new HashMap<>();(最常用)

SortedMap 介面

繼承、介面實現關係:

public interface SortedMap<K,V> extends Map<K,V>

實現:

  1. 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)

實現:

  1. Set<Integer> hashSet = new HashSet<>();(最常用)

SortedSet 介面

繼承、介面實現關係:

public interface SortedSet<E> extends Set<E>

實現:

  1. 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()

實現:

  1. Queue<Integer> queue = new LinkedList<>();LinkedList<E> 實現了 Deque<E> 介面,Deque<E> 介面繼承於 Queue<E> 介面)

  2. 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()

實現:

  1. Deque<Integer> deque = new LinkedList<>();
  2. Deque<Integer> arrayDeque = new ArrayDeque<>();

建議:

  1. Queue 提供的 add()/offer() 方法在 Deque 中也可以使用,但是,使用 Deque,最好不要呼叫 offer(),而是呼叫 offerLast()
    如果直接寫 deque.offer(),我們就需要思考,offer() 實際上是 offerLast(),我們明確地寫上 offerLast(),不需要思考就能一眼看出這是新增到隊尾。
    因此,使用 Deque,推薦總是明確呼叫 offerLast()/offerFirst() 或者 pollFirst()/pollLast() 方法。

  2. 面向抽象程式設計的一個原則:儘量持有介面,而不是具體的實現類。
    我們發現 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() 方法,這樣程式碼更加清晰。


參考:

  1. 集合- 廖雪峰的官方網站
  2. java.util 中關於各集合的原始碼