第五章 集合框架
第一节 Java集合框架概述与核心接口
概述
在Java语言程序设计中,集合框架(Collections Framework)是非常重要的内容,尤其是对于全国计算机等级考试二级的考生来说,掌握集合框架的基本结构、核心接口及常用类是必不可少的。本节主要介绍Java集合框架的定义、组成、核心接口和基本实现类,帮助考生系统理解集合的概念和使用方法,为后续深入学习各种集合类型打下坚实基础。
学习目标:
- 理解集合框架的整体结构及设计理念
- 掌握集合框架中的核心接口(Collection、List、Set、Map等)的定义和用途
- 了解集合框架中的常用实现类及其特点
- 能够编写简单的集合操作代码
核心概念
集合框架(Collections Framework):Java中用于存储和操作一组对象的统一架构。集合框架提供了一组接口、实现类以及算法,使得数据的存储、访问和操作变得简单、高效。
接口(Interface):在集合框架中,接口定义了集合的抽象行为,如添加、删除、遍历等操作。
实现类(Implementation Class):实现接口的具体类,提供了接口中定义操作的具体功能。
Collection接口:所有单列集合的根接口,定义了基本的集合操作方法。
List接口:继承Collection,表示有序集合,允许重复元素。
Set接口:继承Collection,表示不允许重复元素的集合。
Map接口:不继承Collection,表示键值对映射的集合,键唯一,值可以重复。
Iterator接口:用于遍历集合元素的统一方式。
原理分析
Java集合框架采用接口与实现分离的设计模式,提供灵活、可扩展的集合操作方式。核心思想是:
- 接口定义规范:集合的抽象行为被接口定义,如增删改查、遍历等。
- 多种实现:不同实现满足不同需求,如性能、线程安全、元素唯一性等。
- 统一遍历方式:通过Iterator接口实现对各类集合的统一遍历。
内部结构方面,集合类通常基于数组、链表、哈希表、红黑树等数据结构实现,保证不同操作的效率。如ArrayList基于动态数组,HashSet基于哈希表。
设计模式角度,集合框架体现了:
- 工厂模式:通过接口创建不同实现。
- 迭代器模式:统一遍历接口。
- 适配器模式:如Collections类中提供的适配器方法。
详细内容
1. 集合框架的组成
Java集合框架主要由三部分组成:
- 接口层:定义集合的行为规范。
- 实现层:实现接口的具体类。
- 算法层:集合的操作算法,如排序、查找、替换等,通常由Collections工具类实现。
| 层级 | 作用 | 例子 |
|---|---|---|
| 接口层 | 定义集合行为 | Collection, List, Set, Map |
| 实现层 | 提供具体实现 | ArrayList, HashSet, HashMap |
| 算法层 | 提供操作算法 | Collections.sort(), Collections.reverse() |
2. Collection接口详解
- 定义:Collection是所有单列集合的根接口,定义了添加、删除、判断是否包含元素、清空集合、遍历等方法。
- 主要方法:
- add(E e):添加元素
- remove(Object o):删除元素
- contains(Object o):判断是否包含某元素
- size():集合大小
- iterator():获取迭代器
3. List接口及实现类
特点:有序集合,允许元素重复,支持通过索引访问元素。
常用实现类:
- ArrayList:基于动态数组,查询快,增删慢(尤其是中间位置)
- LinkedList:基于双向链表,增删快,查询慢
常用操作:
- get(int index):获取指定位置元素
- add(int index, E element):插入元素
- remove(int index):删除指定位置元素
4. Set接口及实现类
- 特点:不允许元素重复,元素无序(HashSet)、有序(LinkedHashSet)、排序(TreeSet)。
- 常用实现类:
- HashSet:基于哈希表,元素无序
- LinkedHashSet:维护插入顺序
- TreeSet:基于红黑树,元素排序
5. Map接口及实现类
特点:键值对映射,键唯一,值可重复。
常用实现类:
- HashMap:基于哈希表,键无序
- LinkedHashMap:维护插入顺序
- TreeMap:基于红黑树,键排序
主要方法:
- put(K key, V value):添加键值对
- get(Object key):根据键获取值
- remove(Object key):删除键值对
- keySet():获取所有键的集合
6. Iterator接口
- 用于遍历集合元素,替代传统for循环,支持统一的遍历方式。
- 主要方法:
- hasNext():判断是否有下一个元素
- next():获取下一个元素
- remove():删除当前元素(可选)
实例分析
实例一:使用ArrayList存储学生姓名
背景:创建一个ArrayList保存学生姓名,支持添加、删除、遍历操作。
代码示例:
import java.util.ArrayList;
import java.util.Iterator;
public class StudentListDemo {
public static void main(String[] args) {
ArrayList<String> students = new ArrayList<>();
// 添加元素
students.add("张三");
students.add("李四");
students.add("王五");
// 遍历元素
for (String s : students) {
System.out.println(s);
}
// 删除元素
students.remove("李四");
// 使用迭代器遍历
Iterator<String> it = students.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
分析:
- ArrayList适合频繁读取操作。
- 删除元素时根据内容删除,若要根据索引删除可以用remove(int index)。
- 使用增强for循环和迭代器均可遍历集合。
结论:ArrayList是最常用的List实现,适合存储有序、可重复的数据。
实例二:使用HashSet实现不重复的数字集合
背景:创建一个HashSet存储整数,自动去重。
代码示例:
import java.util.HashSet;
import java.util.Set;
public class UniqueNumberSet {
public static void main(String[] args) {
Set<Integer> numbers = new HashSet<>();
numbers.add(10);
numbers.add(20);
numbers.add(10); // 重复元素,不会添加
for (Integer num : numbers) {
System.out.println(num);
}
}
}
分析:
- HashSet不保证元素顺序。
- 重复元素自动过滤,保证集合唯一性。
结论:HashSet适合存储无序且不重复的数据集合。
实例三:使用HashMap保存学生成绩
背景:建立学生姓名和成绩的映射关系。
代码示例:
import java.util.HashMap;
import java.util.Map;
public class StudentScoreMap {
public static void main(String[] args) {
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("张三", 85);
scoreMap.put("李四", 90);
scoreMap.put("王五", 78);
// 获取张三成绩
System.out.println("张三的成绩: " + scoreMap.get("张三"));
// 遍历所有键值对
for (Map.Entry<String, Integer> entry : scoreMap.entrySet()) {
System.out.println(entry.getKey() + " 的成绩是 " + entry.getValue());
}
}
}
分析:
- HashMap根据键快速查找对应的值。
- 遍历时通过entrySet获取键值对。
结论:HashMap适合存储键值映射关系。
常见误区
误区:List集合元素不能重复
- 说明:List允许元素重复,Set才不允许重复。
- 正确做法:根据需求选择List(允许重复)或Set(不允许重复)。
误区:HashSet保证元素的顺序
- 说明:HashSet不保证顺序,若需顺序可用LinkedHashSet。
- 正确做法:根据是否需要顺序选择集合实现。
误区:Map是Collection的子接口
- 说明:Map接口并不继承Collection接口。
- 正确做法:区分单列集合(List、Set)和双列集合(Map)。
误区:使用Iterator遍历时,可直接调用remove()删除元素
- 说明:只能调用Iterator提供的remove(),不能使用集合的remove()。
- 正确做法:在遍历时删除元素,应使用Iterator的remove()方法。
误区:ArrayList适合频繁插入删除操作
- 说明:ArrayList插入删除中间元素效率低,LinkedList更适合。
- 正确做法:根据操作特性选择合适的集合实现。
应用场景
- 学生信息管理系统:通过ArrayList存储学生对象,方便按顺序访问和操作。
- 不重复数据去重:使用HashSet快速过滤重复数据。
- 键值对数据存储:使用HashMap存储配置参数、用户信息等。
- 需要维护顺序且去重的数据:使用LinkedHashSet,如日志系统中的唯一访问记录。
- 排序需求:使用TreeSet或TreeMap实现自动排序,如成绩排名。
知识拓展
- Collections工具类:提供对集合的各种操作方法,如排序(sort)、查找(binarySearch)、线程安全包装(synchronizedXXX)等。
- 泛型的应用:集合中通常使用泛型,保证类型安全,避免强制类型转换错误。
- 线程安全集合:如Vector、Hashtable及并发包中的ConcurrentHashMap,适合多线程环境。
- 自定义对象存储:在集合中存储自定义类型时,需要重写equals()和hashCode()以保证Set和Map的正确功能。
总结回顾
本节内容围绕Java集合框架的基础知识展开,主要包括:
- 集合框架的定义及组成,包括接口、实现类和算法层。
- 核心接口的详细讲解:Collection、List、Set、Map及Iterator。
- 常用实现类介绍:ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet、HashMap、LinkedHashMap、TreeMap。
- 通过典型实例演示集合的常用操作,加深理解。
- 指出常见误区及正确用法,避免考试及实际编程错误。
- 结合实际应用场景说明集合框架的实用价值。
通过本节学习,考生应能理解集合框架的基本结构和核心接口,掌握常用集合的使用及区别,为后续章节深入学习集合的高级用法和算法打下坚实基础。