Java 集合框架图

Java 中的集合是用于存储对象的工具类容器,它实现了常用的数据结构,提供了一系列公开的方法用于增加、删除、修改、查找和便利数据,降低日常开发成本。集合种类非常多,形成了一个比较经典的继承关系数,称为Java 集合框架图。

框架图中主要分为两类:第一类是按照单个元素存储的 Collection ,在继承树中Set 和 List 都实现了 Collection 接口; 第二类是按照 Key-Value 存储的 Map 。

在集合框架图中,红色代表接口,蓝色代表抽象类,绿色代表并发包中的类,灰色代表早期线程安全的类(基本已经弃用)。可以看到,与 Collection 相关的四条线分别是 List 、Queue 、Set、Map 它们的子类会映射到数据结构中的表,数,哈希等。

List 集合

List 集合是线性数据结构的主要实现,集合元素通常存在明确的上一个和下一个元素,也存在明确的第一个元素和最后一个元素。List 集合的遍历结果是稳定的。该体系最常用的是 ArryList 和 LinkedList 两个集合类。

ArryList 是容量可以改变的非线程安全集合。内部实现使用数组进行存储,集合扩展时会创建更大的数组空间,把原有数据复制到新数组中。 ArrayList 支持对元素的快速随机访问,但是插入与删除时速度通常很慢,因为这个过程很有可能需要移动其他移动元素。

LinkedList 的本质是双向链表。与 ArrayList 相比, LinkedList 的插入和删除速度更快,但是随机访问速度很慢。

Queue 集合

Queue(队列)是一种先进先出的数据结构,队列是一种特殊的线性表,它只允许在表的一端进行获取操作,在表的另一端进行插入操作。当队列中没有元素时,称为空队列。自从 BlockingQueue (阻塞队列)问世以来,队列的地位得到极大地提升,在各种高并发编程场景中,由于其本身FIFO的特点和阻塞操作的特点,经常被作为为Buffer(数据缓冲区)使用。

Map 集合

Map 集合是以 Key-Value 键值对作为存储元素实现的哈希结构,Key 按某种哈希函数计算后是唯一的,Value 则是可以重复的。Map 类提供三种 Collection 视图,在集合框架图中,Map 指向 Collection 的箭头仅表示两个类之间的依赖关系。可以使用 keySet()查看所有的 key ,使用 values() 查看所有的 Value ,使用 entrySet() 查看所有的键值的键值对。最早使用存储键值对的 Hashtable 因为性能瓶颈已经被淘汰,而如今广泛使用的 HashMap ,线程是不安全的。 ConcurrentHashMap 是线程安全的,在 JDK 8 中进行了锁的大幅度优化,体现出不错的性能。在多线程并发场景中,优先推荐使用 ConcurrentHashMap ,而不是 HashMap 。 ThreeMap 是 Key 有序的 Map 类集合。

Set 集合

Set 是不允许出现重复元素的集合类型。Set 体系最常用的是 Hashset 、 TreeSet 和 LinkedHashSet 三个集合类。 HashSet 从源码分析是使用 HashMap 来实现的,只是 Value 固定为一个静态对象,使用Key保证集合元素的唯一性,但它不保证集合元素的顺序。 TreeSet 也是如此,从源码分析是使用 TrreMap 来实现的,底层为树结构,在添加新元素到集合中时,按照某种比较规则将其插入合适的位置,保证插入后的集合仍然是有序的。LinkedHashSet 继承自 HashSet ,具有 HashSet 的优点,内部使用链表维护了元素插入顺序。

posted @ 2019-01-21 10:55  这块显卡有点冷  阅读(526)  评论(3编辑  收藏  举报