Java容器简介

一、概述

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

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

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

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

1.1 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(基于数组)
EnumMap key是Enum类型的HashMap(基于数组)
PriorityQueue 队列(基于链表)
ArrayDeque 队列(基于双向链表)

三、同步容器

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

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及之后版本提供了性能更高的容器,我们一般称为并发容器。

0170262fa8a4abe683eb3b12b385573b.png

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

五、容器的内部设计

参考文章

posted @ 2022-05-08 18:53  夏尔_717  阅读(121)  评论(0编辑  收藏  举报