8.1 Java集合概述
8.1 Java集合概述
数组无法存放数量变化的数据
数组长度不可变化,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组就有点无能为力了
集合有什么用
为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java
提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。
集合类的包
起初所有的集合类都位于java.util
包下,后来为了处理多线程环境下的并发安全问题,Java 5
还在java.util.concurrent
包下提供了一些多线程支持的集合类。
集合类与数组的区别
- 数组元素既可以是基本类型的值,也可以是对象的引用变量;
- 集合里不能保存基本类型的值,集合里只能保存对象的引用变量。
集合类的两个根接口
Java
的集合类主要由两个接口派生而出: Collection
和Map
,Collection
和Map
是Java
集合框架的根接口,这两个接口又包含了一些子接口或实现类。
如图8.1所示是Collection
接口、子接口及其实现类的继承树。
Collection的子接口
图8.1显示了Collection
体系里的集合,其中粗线圈出的
Set
,List
,Queue
这三个接口是Collection
接口派生的三个子接口,
Set
代表了无序不可重复集合
,List
代表有序可重复集合
;Queue
是Java
提供的队列
实现,有点类似于List
。
如图8.2所示是Map
体系的继承树,所有的Map
实现类用于保存具有映射关系的数据。
图8.2显示了Map
接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有个功能特征:
Map接口
Map
保存的每项数据都是key-value
对,也就是由key
和value
两个值组成。Map
里的key
是不可重复的,key
用于标识集合里的每项数据,如果需要查阅Map
中的数据时,总是根据Map
的key
来获取。
对于图8.1和图8.2中粗线标识的4个接口,
- 把一个对象添加到
Set
集合时,Set
集合无法记住添加这个元素的顺序,所以Set
里的元素不能重复,否则系统无法准确识别这个元素; List
集合可以记住每次添加元素的顺序、且List
的长度可变。Map
集合里面的每项数据都由两个值组成。
图8.3显示了这三种集合的示意图。
访问各个集合中元素的区别
- 如果访问
List
集合中的元素,可以直接根据元素的索引
来访问; - 如果访问
Set
集合中的元素,则只能根据元素本身
来访问(这也是Set
集合里元素不允许重复的原因)。 - 如果访问
Map
集合中的元素,可以根据每项元素的key
来访问其value
;
集合的常见实现类
对于Set
、List
、 Queue
和Map
四种集合,最常用的实现类,分别是HashSet
、 TreeSet
、 ArrayList
、 ArrayDeque
、 LinkedList
和HashMap
、 TreeMap
这些实现类。
注意
本章主要讲解没有涉及并发控制的集合类,对于Java 5
新増的具有并发控制的集合类,以及Java 7
新增的TransferQueue
及其实现类LinkedTransferQueue
,将在笫16章与多线程一起介绍。