Java
集合框架具有高性能、高效的特点,并允许不同类型的集合,以相似的方式来操作,同时也提供了标准接口来实现扩展。
Java
集合框架为不同类型的集合提供了大量接口,可以这么说整个集合框架就围绕着这一组标准接口而设计。
集合框架有两个基本接口:Collection
和Map
,此外还有一个迭代器接口:Iterator
,及一个标记接口:RandomAccess
。
一、Collection接口和Map接口
Java
集合框架主要包括两种类型的容器:一种是保存独立元素的序列(Collection
),一种是保存成对的“键值对”对象(Map
)。
1.Collection接口
在Collection
中,有些集合允许有重复元素,有些不允许有重复元素;有些元素有序,有些元素无序。
Collection
接口有 3 种子类型,分别是:List
、Set
和Queue
。
(1)List
List
接口是一个有序的集合,使用此接口能够精确的控制每个元素插入的位置,能够通过索引(元素在List
中的位置,类似于数组的下标)来访问List
中的元素,并且,第一个元素的索引为0
,而且允许有相同的元素。
List
接口存储一组不唯一且有序(插入顺序)的对象。
List
有两种类型:
-
ArrayList
- 最基本、最常用
- 擅长随机访问元素
- 在
List
中间插入、移除元素时较慢 - 底层由数组实现
-
LinkedList
- 不常用
- 在随机访问元素时较慢
- 在
List
中间插入和移除元素时代价较低 - 底层由双向链表实现
(2)Set
Set
不保存重复的元素,它具有与Collection
完全一样的接口,因此它没有任何额外的功能。
Set
接口存储一组唯一且无序的对象。
Set
常用的有两种类型:
-
HashSet
- 常用
- 查找速度快
- 无序
-
TreeSet
- 不常用
- 查找速度不如
HashSet
快 - 有序(采用红黑树存储)
由于TreeSet
内部结构支持排序,并且我们可能还会有迭代的操作,因此使用TreeSet
要比使用HashSet
更合适。
(3)Queue
Queue
(队列)是一种较为特殊的线性表,它是典型的先进先出的容器。即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序和取出的顺序是相同的。也可以说,队列只允许在表的前端进行删除操作,而在表的后端进行插入操作。
Queue
接口没有具体的实现,通常有两种方式来实现它。一是使用循环数组;另一种是通过链表。
LinkedList
提供了方法来支持队列的行为,并且实现了Queue
接口。
2.Map接口
Map
接口存储的是一组键值对象,提供key
(键)到value
(值)的映射。其中,value
(值)可以是任意的容器,甚至也可以是另一个Map
.
Map
接口的实现有很多,根据特性的不同,效率的高低,保存的形式及多线程方面的考虑,分为了多种实现方式,包括:
-
HashMap
- 基于散列表的实现,插入和查询键值对的开销是固定的,可以通过构造器设置容量和负载因子
-
TreeMap
- 基于红黑树的实现,查看键值对或键时会被排序
-
LinkedHashMap
- 类似于
HashMap
,但是其使用链表维护内部次序,因此,在迭代访问时速度快
- 类似于
-
ConcurrentHashMap
- 线程安全的
Map
,不涉及同步加锁
- 线程安全的
-
WeakHashMap
- 弱键映射,允许释放映射所指向的对象,专为解决特殊问题而设计
-
IdentityHashMap
- 使用
==
代提equals()
对键进行比较的散列映射,专为解决特殊问题而设计
- 使用
二、Iterator接口
Iterator
(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代集合。
迭代器是一种轻量化的对象,创建它的代价非常小,但是也正是因为其创建代价小,而使得其限制多。例如,只能单向移动,使用next()
获得序列中的下一个元素,使用hasNext()
检查序列中是否还有元素,使用remove()
将迭代器新近返回的元素删除。
使用迭代器来遍历集合,是真正的统一了对集合的访问方式,因为它遍历集合的操作与集合底层的结构做到了分离。
需要注意的是,虽然Iterator
只能向前移动,但是其子类型,ListIterator
却可以双向移动。它可以产生相对于迭代器在集合中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()
替换它访问过的最后一个元素。
三、RandomAccess接口
这个接口不包含任何方法,只是用来测试一个特定的集合是否支持高校的随机访问。
·
网友评论