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对象也被称为迭代器。
迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。迭代器迭代元素过程如下图所示。