一、集合分类
Java中的集合框架提供了多种类型的集合,主要分为两大类:单列集合(只保存单一类型的对象)和双列集合(保存具有键值对关系的对象)。下面对这些集合进行分类介绍,但由于源码分析会涉及大量的代码和细节,这里只简要概述其关键特性和设计思路。
单列集合(Collection)
1. List接口
- 有序集合(元素按其插入的顺序进行排序)。
- 允许有重复的元素。
实现类:
ArrayList
:基于动态数组实现,查询快,插入慢。LinkedList
:基于链表实现,插入快,查询慢。Vector
:与ArrayList类似,但线程安全(同步)。
源码分析(以ArrayList为例):
- ArrayList内部维护了一个Object类型的数组
elementData
。 - 通过
size
属性来记录当前元素的数量。 - 提供了各种方法来操作数组,如
add
,remove
,get
等。
2. Set接口
- 无序集合(不包含重复元素)。
- 不保证元素的顺序。
实现类:
HashSet
:基于哈希表实现,插入和查询速度快。TreeSet
:基于红黑树实现,元素自然排序或定制排序。LinkedHashSet
:维护一个运行于所有条目的双向链表,保持元素的插入顺序。
源码分析(以HashSet为例):
- HashSet内部维护了一个HashMap实例,实际上元素是放在HashMap的key中。
- 利用HashMap的key唯一性来保证HashSet中的元素不重复。
双列集合(Map)
Map接口
- 存储键值对(key-value pair)的映射。
- 任何一个键最多与一个值相关联。
实现类:
HashMap
:基于哈希表实现,提供最快的访问速度。TreeMap
:基于红黑树实现,可以对键进行排序。LinkedHashMap
:维护一个运行于所有条目的双向链表,保持键值对的插入顺序。Hashtable
:线程安全的HashMap实现,但性能较低。ConcurrentHashMap
:支持高并发访问的HashMap实现。
源码分析(以HashMap为例):
- HashMap内部维护了一个Node数组
table
,每个Node是一个键值对。 - 当插入元素时,通过计算key的哈希值来确定元素在数组中的位置。
- 如果发生哈希冲突(两个key的哈希值相同),则使用链表或红黑树来处理冲突。