Java 集合框架概述
数组长度固定、只能存同种类型,写起业务来很不方便。Java 集合框架(Collection Framework)提供一组可动态增长、功能各异的容器,是日常开发中使用最频繁的工具库。
集合与数组的区别
| 对比项 | 数组 | 集合 |
|---|---|---|
| 长度 | 固定,创建后不可变 | 可变,可自动扩容 |
| 存储类型 | 基本类型与对象 | 只存对象(用包装类装基本类型) |
| 便利方法 | 很少 | 增删查改、排序、遍历一应俱全 |
集合体系一览
整个框架分成两大分支:Collection(单元素)与 Map(键值对)。
Collection(接口)
├── List(有序可重复):ArrayList、LinkedList
├── Set(无序不可重复):HashSet、TreeSet
└── Queue(先进先出):LinkedList、PriorityQueue
Map(接口,键不可重复)
├── HashMap(哈希表,最常用)
└── TreeMap(按键排序)
List / Set / Queue 的区别
- List:有序可重复,可按下标访问,如购物车清单。
- Set:不允许重复元素,常用于去重,如已注册用户名。
- Queue:队列,先进先出,多用于任务排队。
Map 键值对
Map 存"键 → 值"映射,通过键快速找值,如学号查学生。
// 片段需放进 main 方法中运行(文件顶部需 import java.util.*)
Map<String, Integer> map = new HashMap<>();
map.put("语文", 95); // 存键值对
map.put("数学", 88);
System.out.println(map.get("语文")); // 输出:95
泛型让集合更安全
用泛型指定元素类型,编译期就能防止放错类型,省去强转:
// 片段需放进 main 方法中运行(文件顶部需 import java.util.*)
List<String> list = new ArrayList<>(); // 只能放 String
list.add("Java");
// list.add(100); // 编译报错:类型不符
String first = list.get(0); // 取出即 String,无需强转
System.out.println(first); // 输出:Java
迭代方式总览
集合没有下标,主要靠增强 for 与 Iterator 遍历:
// 片段需放进 main 方法中运行(文件顶部需 import java.util.*)
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
for (String s : list) { // 增强 for
System.out.print(s + " "); // 输出:A B
}
Iterator<String> it = list.iterator(); // 迭代器遍历
while (it.hasNext()) {
System.out.print(it.next()); // 输出:AB
}
常用实现类对照表
| 需要 | 选谁 | 理由 |
|---|---|---|
| 频繁按下标访问 | ArrayList | 随机访问 O(1) |
| 频繁在中间增删 | LinkedList | 链表插入删除快 |
| 元素去重且无序 | HashSet | 基于哈希,快 |
| 元素去重且要排序 | TreeSet | 红黑树自动排序 |
| 键值对快速查找 | HashMap | 哈希表 O(1) 级别 |
| 按键有序遍历 | TreeMap | 按键排序 |
Collections 工具类
与 Arrays 类似,Collections 提供操作集合的静态方法:sort 排序、reverse 反转、shuffle 打乱、max/min 求最值、copy 复制等。
// 片段需放进 main 方法中运行(文件顶部需 import java.util.*)
List<Integer> nums = new ArrayList<>();
nums.add(5);
nums.add(1);
nums.add(3);
Collections.sort(nums); // 升序排序
System.out.println(nums); // 输出:[1, 3, 5]
System.out.println(Collections.max(nums)); // 输出:5
小结:集合框架的两大分支 Collection(List/Set/Queue)与 Map 覆盖了绝大多数数据组织需求;先按"要不要重复、要不要排序、是否键值对"选型,再用泛型声明,配合 Collections 工具类即可高效开发。