Java 集合类图(转)
1.java集合类图
1.1
1.2
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
发现一个特点,上述所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含hashNext(),next(),remove()三种方法。它的一个子接口LinkedIterator在它的基础上又添加了三种方法,分别是add(),previous(),hasPrevious()。也就是说如果是先Iterator接口,那么在遍历集合中元素的时候,只能往后遍历,被遍历后的元素不会在遍历到,通常无序集合实现的都是这个接口,比如HashSet,HashMap;而那些元素有序的集合,实现的一般都是LinkedIterator接口,实现这个接口的集合可以双向遍历,既可以通过next()访问下一个元素,又可以通过previous()访问前一个元素,比如ArrayList。
还有一个特点就是抽象类的使用。如果要自己实现一个集合类,去实现那些抽象的接口会非常麻烦,工作量很大。这个时候就可以使用抽象类,这些抽象类中给我们提供了许多现成的实现,我们只需要根据自己的需求重写一些方法或者添加一些方法就可以实现自己需要的集合类,工作流昂大大降低。
1.3
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
Set和List接口是Collection接口派生的两个子接口,Queue是Java提供的队列实现,类似于List。
Map实现类用于保存具有映射关系的数据(key-value)。
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
Vector:
用ArrayList代替Vector。Vector是线程安全的,而有的时候我们确实希望在多线程的情况下使用列表,那么这个时候我们可以利用Collections这个类当中为我们提供的synchronizedList(List list),它可以返回一个线程安全的同步的列表,还提供了返回同步的Collections。
Hashtable:
用HashMap代替Hashtable。Hashtable是线程安全的,而有的时候我们确实希望在多线程的情况下使用HashMap,那么这个时候我们可以利用Collections这个类当中为我们提供的synchronizedMap(Map<K,V> m),它可以返回一个线程安全的同步的HashMap
Stack:
用LinkedList代替Stack。当初在设计Stack的时候就有一些潜在的问题,它是从Vector继承而来,对于一个栈来说,它只能是最后放进去的元素,要先出来,但是它继承自Vector,而Vector中有一个方法叫做elementAt(int index),而不能说是通过这个索引index去任意的获得一个元素。结果它就有了这个奇怪的特性,提倡应该自己利用LinkedList去实现一个stack。
对于Set、List和Map三种集合,最常用的实现类分别是HashSet、ArrayList和HashMap三个实现类。(并发控制的集合类,以后有空研究下)。