Interfaces
有两种主要的Collection Types
java.util.Map
java.util.SortedMap
java.util.Collection
java.util.Set
java.util.List
java.util.SortedSet
Implementations
List的三种实现
java.util.Vector
java.util.ArrayList
java.util.LinkedList
三者的异同
三者都是有序的,一般就是加入的次序。
Vector和ArrayList内部都是用数组实现的,可以把它们想象成为一个数组。当容量不够的时候,就新建一个更大的数组,然后把现在这个数组中的所有元素都拷过去。可以想象这种实现可以很方便的直接取出你要的某个元素而不用遍历。但是如果在中间删除或者插入元素,效率就不高了。甚至每次扩容的时候,都是很影响效率的时候。
Vector和ArrayList的区别就是Vector是线程安全的,但ArrayList不是。因为实现线程安全是有代价的,如果应用中不需要线程安全,那么就用ArrayList,如果需要线程安全那就一定要用Vector。
至于java中的LinkedList,其实在数据结构中就是双向链表。插入和删除元素都很快,但是要查找一个元素就慢了。有失必有得,如何选择,就看应用的情况了。
Map和SortedMap的几种实现
java.util.HashTable
java.util.HashMap
java.util.IdentityHashMap
java.util.WeakHashMap
以上四种都是无序的。HashTable和HashMap的区别是HashTable是线程安全的而HashMap不是,这个关系有点像Vector和ArrayList。
IdentityHashMap首先它是一个HashMap,不同的是,它不是根据equal()函数来判断是否重复,只要不是同一个对象,哪怕这两个对象的数据都是一样的,那么就可以add进来。
java.util.LinkedHashMap
java.uil.TreeMap
以上两种是有序的Map,可以进行iterate,当然这是要付出效率代价的。两者不同之处,由名字便可知道,LinkedHashMap用链表来维护这个次序,而TreeMap是用二叉树来维护这个次序。
Sets和SortedSets的几种实现
java.util.HashSet
java.util.LinkedSet
java.util.TreeSet
由名字就可知道什么意思了,不多说了
Collection的选择
需要通过一个key找到一个元素吗?
Yes,那就用Map
No,那就用Collection
如果选择了一个Collection,允许重复元素吗?
Yes,那就用List
No,那就用Set
然后就是决定要不要Sorted...这个就比较难决定了。
如果常常要sort,那就直接选择sorted的类型
如果偶尔或者根本不需要sorted,那就选择普通类型,需要sort的时候先拷到sorted的类型中sort一下。
三种Iterators
java.util.Enumeration
这个基本被Iterator替代掉了,但在某些场合,比如J2ME中还可能用到。
java.util.Iterator
用的最广泛
java.util.ListIterator
双向的Iterator,必须用在实现List的Collection上面。
PS:很多Collection提供的是Fail-Fast Iterators,就是在iterater的时候,这个Collection是不能被更改的,否则就会报出ConcurrentModificationException在多线程环境下面尤其要注意。