图一:java collection 类图
- Queue家族
- 无论是queue还是stack,现在常用的是Deque的实现类:如单线程的ArrayQueue,多线程的ArrayBlockingQueue
- Deque:读作“deck”,算是一种“双端队列”,即支持头部和尾部的数据访问和增删。----支持stack和queue的操作
- 关系:ArrayDeque --> Deque(I) -> Queue(I) -> Collection(I),其中->表示继承,-->表示实现,(I)表示接口。
- 关系:Stack -> Vector ->AbstractList。Stack的方法不如Deque完整和稳定,所以优先采用Deque的实现类来表示Stack。
- List家族
- Vector和ArrayList基本一样,都是Collection家族List下的实现类,都是可变数组,只不过Vector是线程同步的,ArrayList不是。所以一般如果没有同步要求,都建议使用ArrayList
- LinkedList实现了很多接口,如List,Deque,它是双向链表,链表的一般操作都支持。不过也是单线程的(即非同步的),但是可能因为太大了?-->反正不经常使用
- Map家族
- HashMap和HashTable差不多。不过HashMap是单线程(非同步)的,而且支持null(键和值都是null)。HashTable是同步的,且键和值都不能为null。常用HashMap
- Set家族
- HashSet背后是HashMap在支撑,其add()操作添加的就是键值,因此HashSet不允许插入重复的值,当然允许插入null(hashmap允许空键)
Collection总结:
上边是我常用的,这里copy一篇文章的总结(其中的deprecated应该指不常用,不赞成使用,倒不是废弃了):http://www.importnew.com/13801.html
单线程 | 并发 | |
Lists |
|
|
Queues / deques |
|
|
Maps |
|
|
Sets |
|
|
Deque总结:
Deque不常用,这里简单总结下它的用法:
- Deque是双端队列,可以在队首和队尾访问和增删元素。不支持随机访问(List接口支持随机访问元素)
- 下标中返回Special value的,针对的是有容量限制的Deque容器的操作方法的返回值
- Queue和Stack都可以用双端队列来实现
- Deque的Queue实现:在队首删除或访问数据,在队尾插入数据
- Deque的Stack实现:在队首删除、访问、插入数据
Queue和Stack方法与Deque的对应关系如下:(Queue和Stack相应的方法名在Deque中也都支持,其实现是通过调用下表右列中的方法。)
- 注意Queue相关的方法有六个,其实可以分为两组,如下表所示(返回special value也是针对容量有限制的Queue实现的):