Collection接口
概述:容器主要包括Collection和Map两种,Collection存储着单个对象的集合;而Map存储着键值对(两个对象key-->value)的映射表。
一、collection接口继承树:
说明:图中的i:为接口,c:为类。
二、特点:
1、Collection接口,是存放一组单值的最大父接口,所谓的单值是指集合中的每个元素都是一个对象。在新的开发标准中已经很少直接使用此接口进行操作了。
- List接口是Collection接口的子接口;此接口对Collection接口进行了大量的扩充,里面的内容是允许重复的,有序存放的。
- Set接口是Collection接口的子接口;Set没有对Colletion接口进行扩充,里面是不允许存放重复内容的,无序存放的;依靠Object类中的equals()和hashCode()方法来区分是否是同一个对象。
- Queue队列接口,此接口的子类可以实现队列操作。
2、List接口
- ArrayList:是List的子类,基于动态数组实现,支持随机访问;
- Vector:是List的子类,功能和ArrayList类似;Vector是一个元老级的类,在JDK1.0时候就存在此类。在开发中ArrayList性能较高,属于异步处理;而Vector性能较低,属于同步处理。
ArrayList和Vector类的主要区别
序号 |
比较点 |
ArrayList |
Vector |
1 |
推出时间 |
JDK1.2之后推出的,属于新的操作类。 |
JDK1.0时推出,属于旧操作类 |
2 |
性能 |
采用异步处理方式,性能更高 |
采用同步处理方式,性能较低 |
3 |
线程安全 |
属于非线程安全的操作类 |
属于线程安全的操作类 |
4 |
输出 |
只能使用Iterator、foreach输出 |
可以使用Iterator、foreach、Enumeration输出 |
LinkedList:是List和Queue接口的实现类;基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素;不仅如此,LinkedList还可以用作栈、队列和双向队列。
3、Set接口
- HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用Iterator遍历HashSet得到的结果是不确定的。
- SortedSet:此接口主要用于排序操作,即实现此接口的子类都属于排序的子类。
- TreeSet:实现了SortedSet接口;基于红黑树实现,TreeSet的数据是有序存放的,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如HashSet,HashSet的查找时间复杂度为O(1),TreeSet则为O(logN)。
- LinkedHashSet:具有HashSet的查找效率,且内部使用双向链表维护元素的插入顺序。
4、Queue接口
- Queue用于模拟队列这种数据结构,实现“FIFO”等数据结构。通常,队列不允许随机访问队列中的元素。
- Queue 接口并未定义阻塞队列的方法,而这在并发编程中是很常见的。BlockingQueue 接口定义了那些等待元素出现或等待队列中有可用空间的方法,这些方法扩展了此接口。
- Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。
- LinkedList:可以用它来实现双向队列;LinkedList类是List接口的实现类,同时它也实现了Deque接口。因此它也可以当做一个双端队列来用,也可以当作“栈”来使用。并且,它是以链表的形式来实现的,这样的结果是它的随机访问集合中的元素时性能较差,但插入与删除操作性能非常出色。
- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按队列元素的大小重新排序。当调用peek()或者是poll()方法时,返回的是队列中最小的元素。当然你可以与TreeSet一样,可以自定义排序。
三、各种线性表选择策略
- 数组:是以一段连续内存保存数据的;随机访问是最快的,但不支持插入、删除、迭代等操作。
- ArrayList与ArrayDeque:以数组实现;随机访问速度还行,插入、删除、迭代操作速度一般;线程不安全。
- Vector:以数组实现;随机访问速度一般,插入、删除、迭代速度不太好;线程安全的。
- LinkedList:以链表实现;随机访问速度不太好,插入、删除、迭代速度非常快。