8.1 Java集合概述

8.1 Java集合概述

数组无法存放数量变化的数据

数组长度不可变化,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组就有点无能为力了

集合有什么用

为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。

集合类的包

起初所有的集合类都位于java.util包下,后来为了处理多线程环境下的并发安全问题,Java 5还在java.util.concurrent包下提供了一些多线程支持的集合类。

集合类与数组的区别

  • 数组元素既可以是基本类型的值,也可以是对象的引用变量;
  • 集合里不能保存基本类型的值,集合里只能保存对象的引用变量。

集合类的两个根接口

Java的集合类主要由两个接口派生而出: CollectionMap,CollectionMapJava集合框架的根接口,这两个接口又包含了一些子接口或实现类。

如图8.1所示是Collection接口、子接口及其实现类的继承树。
这里有一张图片

Collection的子接口

图8.1显示了Collection体系里的集合,其中粗线圈出的

Set,List,Queue这三个接口是Collection接口派生的三个子接口,

  • Set代表了无序不可重复集合,
  • List代表有序可重复集合;
  • QueueJava提供的队列实现,有点类似于List

如图8.2所示是Map体系的继承树,所有的Map实现类用于保存具有映射关系的数据。
这里有一张图片
图8.2显示了Map接口的众多实现类,这些实现类在功能、用法上存在一定的差异,但它们都有个功能特征:

Map接口

Map保存的每项数据都是key-value对,也就是由keyvalue两个值组成。
Map里的key是不可重复的,
key用于标识集合里的每项数据,如果需要查阅Map中的数据时,总是根据Mapkey来获取。

对于图8.1和图8.2中粗线标识的4个接口,

  • 把一个对象添加到Set集合时,Set集合无法记住添加这个元素的顺序,所以Set里的元素不能重复,否则系统无法准确识别这个元素;
  • List集合可以记住每次添加元素的顺序、且List的长度可变。
  • Map集合里面的每项数据都由两个值组成。

图8.3显示了这三种集合的示意图。
这里有一张图片

访问各个集合中元素的区别

  • 如果访问List集合中的元素,可以直接根据元素的索引来访问;
  • 如果访问Set集合中的元素,则只能根据元素本身来访问(这也是Set集合里元素不允许重复的原因)。
  • 如果访问Map集合中的元素,可以根据每项元素的key来访问其value;

集合的常见实现类

对于SetListQueueMap四种集合,最常用的实现类,分别是HashSetTreeSetArrayListArrayDequeLinkedListHashMapTreeMap这些实现类。
注意
本章主要讲解没有涉及并发控制的集合类,对于Java 5新増的具有并发控制的集合类,以及Java 7新增的TransferQueue及其实现类LinkedTransferQueue,将在笫16章与多线程一起介绍。