Java集合工具包位于Java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Set集合、Map映射、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。
Java集合类的整体框架如下:
其中
- 实线和空心三角形表示继承关系
- 虚线和空心三角形表示接口实现关系
- 虚线和实心三角形表示依赖关系(一个类的方法操作另一个类的对象)
上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,AbstractList,AbstractMap等,而点线边框的是接口,比如Collection,Iterator,List等。
由上图可以很清楚的看到Java的容器类主要由两个接口派生而出:Collection和Map。
从上图中可以看出,集合类主要分为两大类:Collection和Map。
Collections和Arrays
Collection是容器层次结构中根接口。而Collections和Arrays是一个提供一些处理容器类静态方法的类。例如常用的Arrays.sort() Arrays.copy();方法等。
Collection体系 – Set,List,Queue (三个Interface)
Set:
一个不包括重复元素(包括可变对象)的Collection,是一种无序的集合。如果a.equals(b),那么set里是不能同时包含a和b的,并且set里最多只能有一个null。
实现Set的有:
- HashSet : 内部采用HashMap实现的
- LinkedHashSet : 采用LinkedHashMap实现
- TreeSet : 采用TreeMap实现
List:
一个有序的Collection(也称序列),元素可以重复。确切的讲,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。
实现List的有:
- ArrayList : 采用数组实现,适合随机查找,但不适合频繁增删
- LinkedList : 链表实现,适合频繁增删,但不适合随机查找
- Vector : 历史遗留产物,同步版的ArrayList(使用了synchronized方法)
- Stack : 继承自Vector。Java里其实没有纯粹的Stack,可自己实现一个,封装一下LinkedList即可。
Queue:
一种队列是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。另一种是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。虽然接口并未定义阻塞方法,但是实现类扩展了此接口。
Map体系
Map:是一个键值对的集合。也就是说,一个映射不能包含重复的键,每个键最多映射到一个值。该接口取代了Dictionary抽象类。
实现map的有:
- HashMap/HashTable : 和ArrayList一样采用数组实现,超过初始容量会对性能有损耗。
- TreeMap : TreeMap中所有的元素都保持着某种固定的顺序
- Properties : 继承的HashTable (用于配置文件)