【数据结构前置知识】集合框架
什么是集合框架?
集合框架 是一个统一的、可扩展的体系结构,用于表示和操作集合。
简单来说:
集合:就是一个包含多个元素(对象)的容器,类似于一个“超级数组”。
框架:提供了一组预定义的接口(规定能做什么)、类(具体的实现)和算法(如何做),让你能够以标准、高效的方式来存储、检索、操作和传递一组对象。
核心思想:面向接口编程。你写代码时,应该尽量依赖接口(如 List
),而不是具体的实现类(如 ArrayList
)。这样程序更灵活,易于维护和修改。
为什么需要集合框架?(解决的问题)
替代传统数组的局限性:
数组长度固定,而集合框架提供了动态扩容的容器(如
ArrayList
)。数组只能通过下标访问,而集合提供了丰富的操作(如查找、排序、插入、删除)。
数组可以存储基本类型和对象,而泛型集合主要存储对象(基本类型通过包装类)。
提供统一的标准:在集合框架出现之前,程序员需要自己实现链表、栈、哈希表等数据结构。集合框架提供了一套标准、经过充分测试和优化的实现,提高了开发效率和代码质量。
减少编程负担:你不需要再从零开始实现一个双向链表或一个红黑树,直接使用
LinkedList
或TreeMap
即可。提高代码复用性和可维护性:基于接口的编程使得更换集合的实现非常容易(例如,今天用
ArrayList
,明天发现需要频繁插入,可以轻松换成LinkedList
,而修改的代码很少)。
Java集合框架的体系结构(以Java为例,最经典)
Java的集合框架主要分为两大派系:
Collection
接口:存储单个对象的集合。
Map
接口:存储键值对(Key-Value)的集合。
下图清晰地展示了它们的关系:
核心接口详解
1. Collection 接口的三个主要子接口
List
(列表/线性表):特点:有序、可重复。你可以精确控制每个元素的插入位置,并通过整数索引(类似数组下标)来访问元素。
常用实现类:
ArrayList
:基于动态数组实现。查询快,增删慢。线程不安全。LinkedList
:基于双向链表实现。增删快,查询慢。还实现了Deque
(双端队列)接口。Vector
:古老的、线程安全的动态数组实现,现在已很少使用,通常用Collections.synchronizedList
代替。
Set
(集合):特点:无序、不可重复。它更像数学中的集合,不关心顺序,只关心成员是否存在。
常用实现类:
HashSet
:基于HashMap
实现,使用哈希表存储元素。查询速度极快。是最常用的Set。LinkedHashSet
:是HashSet
的子类,同时维护了一个运行于所有条目的双向链表。既保证了元素的唯一性,又维护了插入顺序。TreeSet
:基于TreeMap
(红黑树)实现。元素会按照自然顺序或者自定义比较器进行排序。
Queue
(队列):特点:用于模拟队列这种数据结构,通常遵循FIFO(先进先出)规则。
常用实现类:
LinkedList
:也实现了Queue
接口。PriorityQueue
:优先级队列,元素按其自然顺序或比较器顺序出队。
2. Map 接口
特点:存储键值对,Key不可重复,每个Key最多映射到一个Value。
常用实现类:
HashMap
:基于哈希表实现。允许使用null
作为 key 或 value。存取效率最高。是最常用的Map。LinkedHashMap
:类似于LinkedHashSet
,维护了插入顺序或访问顺序。TreeMap
:基于红黑树实现。Key会被排序。Hashtable
:古老的、线程安全的实现,不允许null
键值,现在已很少使用,通常用ConcurrentHashMap
代替。