Interfaces
有兩種主要的Collection Types
java.util.Map
java.util.SortedMap
java.util.Collection
java.util.Set
java.util.List
java.util.SortedSet
Implementations
List的三種實現(xiàn)
java.util.Vector
java.util.ArrayList
java.util.LinkedList
三者的異同
三者都是有序的,一般就是加入的次序。
Vector和ArrayList內(nèi)部都是用數(shù)組實現(xiàn)的,可以把它們想象成為一個數(shù)組。當容量不夠的時候,就新建一個更大的數(shù)組,然后把現(xiàn)在這個數(shù)組中的所有元素都拷過去。可以想象這種實現(xiàn)可以很方便的直接取出你要的某個元素而不用遍歷。但是如果在中間刪除或者插入元素,效率就不高了。甚至每次擴容的時候,都是很影響效率的時候。
Vector和ArrayList的區(qū)別就是Vector是線程安全的,但ArrayList不是。因為實現(xiàn)線程安全是有代價的,如果應(yīng)用中不需要線程安全,那么就用ArrayList,如果需要線程安全那就一定要用Vector。
至于java中的LinkedList,其實在數(shù)據(jù)結(jié)構(gòu)中就是雙向鏈表。插入和刪除元素都很快,但是要查找一個元素就慢了。有失必有得,如何選擇,就看應(yīng)用的情況了。
Map和SortedMap的幾種實現(xiàn)
java.util.HashTable
java.util.HashMap
java.util.IdentityHashMap
java.util.WeakHashMap
以上四種都是無序的。HashTable和HashMap的區(qū)別是HashTable是線程安全的而HashMap不是,這個關(guān)系有點像Vector和ArrayList。
IdentityHashMap首先它是一個HashMap,不同的是,它不是根據(jù)equal()函數(shù)來判斷是否重復(fù),只要不是同一個對象,哪怕這兩個對象的數(shù)據(jù)都是一樣的,那么就可以add進來。
java.util.LinkedHashMap
java.uil.TreeMap
以上兩種是有序的Map,可以進行iterate,當然這是要付出效率代價的。兩者不同之處,由名字便可知道,LinkedHashMap用鏈表來維護這個次序,而TreeMap是用二叉樹來維護這個次序。
Sets和SortedSets的幾種實現(xiàn)
java.util.HashSet
java.util.LinkedSet
java.util.TreeSet
由名字就可知道什么意思了,不多說了
Collection的選擇
需要通過一個key找到一個元素嗎?
Yes,那就用Map
No,那就用Collection
如果選擇了一個Collection,允許重復(fù)元素嗎?
Yes,那就用List
No,那就用Set
然后就是決定要不要Sorted...這個就比較難決定了。
如果常常要sort,那就直接選擇sorted的類型
如果偶爾或者根本不需要sorted,那就選擇普通類型,需要sort的時候先拷到sorted的類型中sort一下。
三種Iterators
java.util.Enumeration
這個基本被Iterator替代掉了,但在某些場合,比如J2ME中還可能用到。
java.util.Iterator
用的最廣泛
java.util.ListIterator
雙向的Iterator,必須用在實現(xiàn)List的Collection上面。
PS:很多Collection提供的是Fail-Fast Iterators,就是在iterater的時候,這個Collection是不能被更改的,否則就會報出ConcurrentModificationException在多線程環(huán)境下面尤其要注意。