Java 集合框架(一)—— 介面綜述

shaopiing發表於2016-05-29

前言:凡是使用 Java 程式設計的,幾乎肯定會用到集合框架,比如 ArrayList、LinkedList、HashSet、HashMap 等,集合框架的程式碼絕對是大師級的實現,所以為了更好地使用集合框架,我們有必要系統地學習下集合框架的內容。

一、介面綜述

  集合框架的整體結構圖如下(摘自《Thinking In Java》):

  

  上圖也許有些複雜,因為包含了很多我們很少用到的抽象類,其實,只需要記住下面兩張圖即可(摘自張龍的 collection 集合教程):

  

  

  Collection 介面裡定義瞭如下操作集合元素的方法:

  • boolean add(Object o):用於向集合裡新增一個元素,如果集合物件被新增操作確實改變了,則返回 true。
  • boolean addAll(Collection c):把集合 c 裡的所有元素新增到指定集合裡,如果集合物件被新增操作改變了,則返回 true。
  • void clear():清除集合裡的所有元素,將集合長度變為 0.
  • boolean contain(Object o):判斷集合裡是否包含指定元素,包含則返回 true。
  • boolean containAll(Collection c):判斷集合裡是否包含集合 c 裡的所有元素。
  • boolean isEmpty():判斷集合是否為空,當集合長度為 0 時返回 true。
  • Iterator iterator():返回一個 Iterator 物件,用於遍歷集合裡的元素。
  • boolean remove(Object o):刪除集合中指定的元素 o,當集合裡包含了一個或多個元素 o 時,這些元素將被刪除,該方法返回 true。
  • boolean removeAll(Collection c):從集合中刪除集合 c 裡面包含的所有元素,如果刪除了一個或多個元素,則返回 true。
  • boolean retainAll(Collection c):從集合中刪除集合 c 裡不包含的元素,如果刪除了一個或多個元素,則返回 true。
  • int size():該方法返回集合裡的元素的個數
  • Object[] toArray():該方法把集合轉換成一個陣列,所有的集合元素變成對應的陣列元素。

 

  Iterator 介面也是 Java 集合框架的成員,但它與 Collection 系列、Map 系列的集合不一樣:Collection 系列集合、Map 系列集合主要用於盛裝其他物件,而 Iterator 則主要用於遍歷(即迭代訪問)Collection 集合中的元素,Iterator 物件也被稱為迭代器。

  Iterator 介面包含 3 個方法:

1 public interface Iterator<E>{
2   E next();      // 返回集合裡的下一個元素
3   boolean hasNext(); // 如果被迭代的集合元素還沒有被遍歷,則返回 true
4   void remove();     // 刪除集合裡上一次 next 方法返回的元素
5 }

  通過反覆呼叫 next 方法,可以逐個訪問集合中的每個元素。但是,如果到達了集合的末尾,next 方法將丟擲一個 NoSuchElementException。因此,需要在呼叫 next 之前呼叫 hasNext 方法。如果迭代器物件還有多個供訪問的元素,則返回 true。如果想要檢視集合中的所有元素,就請求一個迭代器,並在 hasNext 返回 true 時反覆地呼叫 next 方法。例如:

Collection<String> c = ...;
Iterator<String> iter  = c.iterator();
while (iter.hasNext()) {
    String element = iter.next();
    do something element
}

  不過,從 Java SE 5.0 起,這個迴圈可以採用一種更加優雅的縮寫方式。用 "for each" 迴圈可以更加簡練地表達同樣的迴圈操作:

for (String element : c) {
    do something else
}

  PS:程式設計老手會注意到:Iterator 介面的 next 和 hasNext 方法與 Enumeration 介面的 nextElement 和 hasElement 方法的作用一樣,但是可能是 Java 集合類庫的設計者覺得這個方法名太長,於是引入了具有較短方法的新介面。

  注意:這裡還有個有用的類推。可以將 Iterator.next 與 InputStream.read 看作為等效的。從資料流中讀取一個位元組,就會自動地 "消耗掉" 這個位元組。下一個呼叫 read 將會消耗並返回輸入的下一個位元組,用同樣的方式,反覆地呼叫 next 就可以讀取集合中所有元素。

  Iterator 介面的 remove 方法要和 next 方法一起使用,如果呼叫 remove 之前沒有呼叫 next 是不合法的,會丟擲一個 IllegalStateException 異常。

  如果想刪除相鄰的兩個元素,需要這樣:

it.next();
it.remove();
it.next();
it.remove();

  將介面是空洞的,因為沒有具體的精彩的實現,所有接下來還是具體介紹 集合框架中的幾個常用的實現類:

  

相關文章