Skip to content

简介概览

概述

Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射。Collection接口又有3种子类型,ListSetQueue,再下面是一些抽象类,最后是具体实现类,常用的有ArrayListLinkedListHashSetLinkedHashSetHashMapLinkedHashMap等等。

An image

集合框架是一个用来代表和操纵集合的统一架构。所有的集合框架都包含如下内容:

  • 接口:是代表集合的抽象数据类型。例如CollectionListSetMap等。之所以定义多个接口,是为了以不同的方式操作集合对象。
  • 实现(类):是集合接口的具体实现。从本质上讲,它们是可重复使用的数据结构,例如:ArrayListLinkedListHashSetHashMap
  • 算法:是实现集合接口的对象里的方法执行的一些有用的计算,例如:搜索和排序。这些算法被称为多态,那是因为相同的方法可以在相似的接口上有着不同的实现。

Java不考虑多线程并发的情况下,容器类一般使用ArrayListHashMap等线程不安全的类,效率更高。在并发场景下,常会用到ConcurrentHashMapArrayBlockingQueue等线程安全的容器类,虽然牺牲了一些效率,但却得到了安全。

List、Set、Queue、Map四者的区别?

  • List(对付顺序的好帮手): 存储的元素是有序的、可重复的。
  • Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。
  • Queue(实现排队功能的叫号机): 按特定的排队规则来确定先后顺序,存储的元素是有序的、可重复的。
  • Map(用key来搜索的专家): 使用键值对(key-value)存储,key是无序的、不可重复的,value是无序的、可重复的,每个键最多映射到一个值。

常用容器

标准集合类汇总于下表:

容器简述
ArrayList有序可重复(基于动态数组)
LinkedList有序可重复(基于双向链表)
HashSet无序不重复
LinkedHashSet有序不重复HashSet(基于数组 + 双向链表)
TreeSet有序HashSet(基于红黑树)
EnumSet添加枚举类元素的专用集合类
HashMap键值对(基于数组 + 链表/红黑树)
TreeMap有序HashMap(基于红黑树)
WeakHashMap弱键HashMap(基于数组 + 链表)
LinkedHashMap有序HashMap(继承HashMap,双向链表实现排序)
IdentityHashMap允许键重复的HashMap(基于数组)
EnumMapkey是Enum类型的HashMap(基于数组)
PriorityQueue队列(基于链表)
ArrayDeque队列(基于双向链表)

同步容器

为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。

java
List list = Collections.synchronizedList(new ArrayList());
Set set = Collections.synchronizedSet(new HashSet());
Map map = Collections.synchronizedMap(new HashMap());

上面提到的这些经过包装后线程安全容器,都是基于synchronized这个同步关键字实现,所以也被称为同步容器,Java提供的同步容器还有VectorStackHashtable,这三个容器并不是基于包装类实现,但同样是基于synchronized实现的,对这三个容器的遍历,同样要加锁保证互斥。

容器简述
Vector同步版ArrayList
Stack继承Vector(后进先出)
Hashtable同步版HashMap
Properties继承Hashtable(键值都字符串)

并发容器

Java1.5版本之前所谓的线程安全的容器,主要指的就是同步容器。不过同步容器有个最大的问题,那就是性能差,所有方法都用synchronized来保证互斥,串行度太高了。因此Java1.5及之后版本提供了性能更高的容器,我们一般称为并发容器。

An image

容器简述
CopyOnWriteArrayList并发版ArrayList
ConcurrentHashMap(重要)并发版HashMap
ConcurrentSkipListMap基于跳表的并发Map
ConcurrentSkipListSet基于跳表的并发Set
CopyOnWriteArraySet并发Set
LinkedBlockingDeque阻塞队列(基于双向链表)
ArrayBlockingQueue阻塞队列(基于数组)
LinkedBlockingQueue阻塞队列(基于链表)
SynchronousQueue读写成对的队列
LinkedTransferQueue基于链表的数据交换队列
PriorityBlockingQueue线程安全的优先队列
DelayQueue延时队列
ConcurrentLinkedQueue并发队列(基于链表)
ConcurrentLinkedDeque并发队列(基于双向链表)

容器的内部设计