1. 集合概述
1.1. 引入
在前面的章节中我们学习了数组,数组可以存储多个对象,但是数组只能存储相同类型的对象,如果要存储一批不同类型的对象,数组便无法满足需求了。为此,Java提供了集合,集合可以存储不同类型的多个对象。本章将针对Java中的集合类进行详细地讲解。
1.2. 集合概念
为了存储不同类型的多个对象,Java提供了一系列特殊的类,这些类可以存储任意类型的对象,并且存储的长度可变,被统称为集合。集合可以简单理解为一个长度可变,可以存储不同数据类型的动态数组。集合都位于java.util包中,使用集合时必须导入java.util包。
1.3. 集合体系核心架构
集合体系核心架构图如下所示,列出了Java开发中常用的一些集合类,其中,虚线框里都是接口类型,实线框里是具体的实现类。

1.4. 集合中的核心接口
集合中的核心接口如下表所示。
|   接口  |   描述  | 
|   Collection  |   集合中最基本的接口,一般不直接使用该接口  | 
|   List  |   Collection的子接口,用于存储一组有序、不唯一的对象,是集合中常用的接口之一  | 
|   Set  |   Collection的子接口,用于存储一组无序、唯一的对象  | 
|   Map  |   用于存储一组键值对象,提供键到值的映射  | 
2. Collection接口
Collection接口是Java单列集合中的根接口,它定义了各种具体单列集合的共性,其他单列集合大多直接或间接继承该接口,Collection接口的定义如下所示:
public interface Collection<E> extends Iterable<E>{
    //Query Operations
} 
Collection接口的常用方法如下。
|   方法声明  |   功能描述  | 
|   boolean add(Object o)  |   向集合中添加一个元素  | 
|   boolean addAll(Collection c)  |   将指定集合c中的所有元素添加到本集合中  | 
|   void clear()  |   删除集合中的所有元素  | 
|   boolean remove(Object o)  |   删除集合中指定的元素  | 
|   boolean removeAll(Collection c)  |   删除当前集合中包含集合c中的所有元素  | 
|   boolean isEmpty()  |   判断集合是否为空  | 
|   boolean contains(Object o)  |   判断集合中是否包含某个元素  | 
|   boolean containsAll(Collection c)  |   判断集合中是否包含指定集合c中的所有元素  | 
|   Iterator iterator()  |   返回集合的的迭代器(Iterator),迭代器用于遍历该集合所有元素  | 
|   int size()  |   获取集合元素个数  | 
2.1. List接口
List接口继承自Collection接口,List接口实例中允许存储重复的元素,所有的元素以线性方式进行存储。在程序中可以通过索引访问List接口实例中存储的元素。另外,List接口实例中存储的元素是有序的,即元素的存入顺序和取出顺序一致。
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引操作集合的特有方法。List接口的常用方法如下表所示。
|   方法声明  |   功能描述  | 
|   void add(int index,Object element)  |   将元素element插入List的index索引处  | 
|   boolean addAll(int index,Collection c)  |   将集合c所包含的所有元素插入到List集合的index索引处  | 
|   Object get(int index)  |   返回集合index索引处的元素  | 
|   Object remove(int index)  |   删除index索引处的元素  | 
|   Object set(int index, Object element)  |   将index索引处元素替换成element对象,并将替换后的元素返回  | 
|   int indexOf(Object o)  |   返回对象o在List中第一次出现的位置索引  | 
|   int lastIndexOf(Object o)  |   返回对象o在List中最后一次出现的位置索引  | 
|   List subList(int fromIndex, int toIndex)  |   返回从索引fromIndex(包括)到 toIndex(不包括)处所有元素集合组成的子集合  | 
2.2. Set接口
Set接口也继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充。与List接口不同的是,Set接口中元素是无序的,并且都会以某种规则保证存入的元素不出现重复。
Set接口常见的实现类有3个,分别是HashSet、LinkedHashSet、TreeSet。其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,具有良好的存取和查找性能;LinkedHashSet是链表和哈希表组合的一个数据存储结构;TreeSet则是以二叉树的方式存储元素,它可以对集合中的元素进行排序。
3. Map接口
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。Map中键对象Key不允许重复,访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。
Map接口常用方法如下所示。
|   方法声明  |   功能描述  | 
|   void put(Object key, Object value)  |   将指定的值和键存入到集合中,并进行映射关联  | 
|   Object get(Object key)  |   返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null  | 
|   void clear()  |   移除所有的键值对元素  | 
|   V remove(Object key)  |   根据键删除对应的值,返回被删除的值  | 
|   int size()  |   返回集合中的键值对的个数  | 
|   boolean containsKey(Object key)  |   如果此映射包含指定键的映射关系,则返回 true。  | 
|   boolean containsValue(Object value)  |   如果此映射将一个或多个键映射到指定值,则返回 true  | 
|   Set keySet()  |   返回此映射中包含的键的Set集合  | 
|   Collection<V> values()  |   返回此映射中包含的值的Collection集合  | 
|   Set<Map.Entry<K,V>>entrySet()  |   返回此映射中包含的映射关系的Set集合  | 
4. 集合遍历
Iterator接口是Java集合框架中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(遍历)Collection中的元素,通常情况下Iterator对象也被称为迭代器。
迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。迭代器迭代元素过程如下图所示。



















