2007年8月10日 星期五

Collection Framework 概觀

Collection Framework 是實現資料結構的重要介面, 基本上如下表所示,
其中 Set, List 繼承於 Collection 介面.
Set --> StoredSet
Map --> StoredMap

Interface

Implementation

Historical

Set(禁止重複)

HashSet(未排序)



TreeSet
(
照字母排序)

LinkedHashSet
(按照加入的順序排序,
實現queue的先進先出)


List(可重複)


ArrayList
(
未排序)


LinkedList(特性同上)

Vector
Stack

(thread-safe)

Map(key-value)

HashMap(未排序)


TreeMap

(照字母排序)

LinkedHashMap
(
特性同上)

Hashtable
Properties

(thread-safe)


三個介面的特性已以大致在表中呈現, 其中 StoredSet, StoredMap
其實是利用 TreeSet, TreeMap 介面來實現. 下面舉一個簡例:
Comparator comparator = Collections.reverseOrder();
Set reverseSet = new TreeSet(comparator);
reverseSet.add("Bernadine");
reverseSet.add("Elizabeth");
reverseSet.add("Gene");
reverseSet.add("Clara");
System.out.println(reverseSet);
output: [Gene, Elizabeth, Clara, Bernadine]

該例呼叫 Collections.reverseOrder(), 再傳入一個 Comparator, 使得 TreeSet
具有倒序的效果, 然而 TreeSet 本身的特性是照字母排序的, 會先排序後, 再執行 Comparator
裡面的 method.

在 Linked 開頭的部分(LinkedHashSet, LinkedList, LinkedHashMap)
都實現了 queue 的資料結構, 也就是先進先出, 跟按照字母排序的 Tree..略有不同
一個簡例如下:
Set linkedHashSet = new LinkedHashSet();
linkedHashSet.add("Bernadine");
linkedHashSet.add("Elizabeth");
linkedHashSet.add("Will");
linkedHashSet.add("Gene");
linkedHashSet.add("Elizabeth");
linkedHashSet.add("Clara");
System.out.println(linkedHashSet);
output: [Bernadine, Elizabeth, Will, Gene, Clara]

那麼使用這些資料結構的時機, 若不需要排序的, 可以使用 Hash 的介面. 若有排序的需求,
可以利用 Tree, Linked..的介面, 但是速度會比較慢. 在 Thread-safe 方面, 則可以參考 Vector, Stack, Hashtable, Properties.

在最後補充遍巡(Iterator) Hash 的方式:
HashMap m = new HashMap();
m.put("foo", "foo");

Set entrySet = m.entrySet();
Iterator it = entrySet.iterator();

while(it.hasNext()){
Map.Entry me = (Map.Entry)it.next();
Object key = me.getKey();
Object value = me.getValue();
}
Reference:
Introduction to the Collections Framework

0 意見: