Java集合是一个庞大的体系,用来存储、操作大量数据,集合占据了java.util的半壁江山,下面只介绍常用一些集合类:
如图,集合主要分四个大板块:
- Collection集合
- Map集合
- 迭代器和枚举器
- 工具类
两大接口Collection和Map。Collection是单列集合,Map是双列集合,存储键值对元素。
Collection
Collection是包含了集合的基本操作和属性的接口,主要有List和Set两大分支:
- List是一个有序(放入的顺序)、有下标、允许元素重复的集合;
- Set是一个无序、无下标的、不允许元素重复的集合;
另外Collection还有一个Queue分支,但没有与数据结构对应的队列类,而是通过LinkedList来实现的队列,LinkedList还实现了栈的功能。
常用类
List:
- ArrayList:是数组实现的列表,动态数组,非线程安全;
- LinkedList:是双向链表实现的列表,非线程安全;
- Vector:是数组实现的矢量队列,动态数组,线程安全;
- Stack:是vector实现的栈,动态数组,线程安全;
Set:
- HashSet:是HashMap实现的集合,非线程安全;
- LinkedHashSet:是LinkedHashMap实现的有序集合,非线程安全;
- TreeSet:是实现SortedSet接口,由TreeMap实现的有序集合树,非线程安全;
Map
Map是键值对映射的集合,一个键对应一个值,键不允许重复,值可以重复。可以利用Map键不重复的特性实现Set。
常用类
- HashMap:是存储键值对的哈希表,非线程安全;
- LinkHashMap:是HashMap实现的键值对哈希表,非线程安全;
- HashTable:是存储键值对的哈希表,线程安全
- IdentityHashMap:是HasMap实现的存储键值对的弱键哈希表,非线程安全。
- TreeMap:是存储键值对的有序集合树,非线程安全。
上图中看似Collection和Map独立,其实也不完全独立,比如:Hashset是通过HashMap实现的,Tree是通过TreeMap实现的。
迭代器和枚举器
两大用于遍历元素的接口Enumerationm枚举器和Iterator迭代器。由于Collection是单列的,可直接迭代。Map支持键值对迭代、键迭代、值迭代。Iterator是JDK1.2提出的,Enumeration可以转化为Iterator,Enumeration的功能要比Iterator少,Enumeration只能用在HashTable、vector、Stack。ListIterator是Iterator的子接口,专门适用于List,在Iterator的基础上支持逆向迭代。
集合工具类
两个工具类Arrays和Collections,Arrays主要是对数组的操作,它可以通过asList方法将数组转化为ArrayList(Arrays的内部类)。Collections是专门用于实现基础集合的同步工具类,存在大量操作集合的静态方法和大量的内部类。但是这些同步类的并发控制是通过synchronized同步方法实现的,效率并不是很高。所以在JUC中提供了与普通集合对应的支持高并发的集合类。
需要注意的是:Arrays的内部类ArrayList不能修改长度,也就是不能做add和remove操作,因为该ArrayList没有实现这两个方法,但是可以做修改操作(set(int index, E element))
数据结构
集合中的主要数据结构有:
- 数组
- 链表、双向链表
- 队列、双向队列
- 栈
- 树、红黑树
- 哈希表