Collection Framework 是實現資料結構的重要介面, 基本上如下表所示,
其中 Set, List 繼承於 Collection 介面.
Set --> StoredSet
Map --> StoredMap
Interface | Implementation | Historical | |||
Set(禁止重複) | HashSet(未排序) | | TreeSet | LinkedHashSet (按照加入的順序排序, 實現queue的先進先出) | |
List(可重複) | | ArrayList | | LinkedList(特性同上) | Vector (thread-safe) |
Map(key-value) | HashMap(未排序) | | TreeMap (照字母排序) | LinkedHashMap | Hashtable (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 意見:
張貼留言