Java 集合参考
Java 集合参考是 Java 后端开发中不可或缺的核心工具,用于高效存储、管理和操作对象集合。集合框架提供了抽象接口和具体实现,如 List、Set、Queue 和 Map,使开发者无需关心底层数据结构细节即可高效处理数据。掌握集合不仅可以提升算法实现能力,还能优化内存使用、提高程序性能,并支持可扩展、可维护的系统架构设计。
在软件开发和系统架构中,集合用于数据缓存、用户会话管理、任务队列处理以及并发操作的协调。核心概念包括集合语法、数据结构(数组、链表、哈希表、红黑树)、算法(排序、查找、过滤)以及面向对象设计原则(封装、多态、接口驱动设计)。开发者需要结合算法思维选择合适的集合类型以满足性能和功能需求。
通过本参考文档,读者将学习如何创建和操作各种集合,应用高效算法,进行错误处理,并避免常见问题如内存泄漏和低效迭代。同时,将展示集合在真实开发场景中的应用模式,为高级后端开发奠定坚实基础。
基础示例
javaimport java.util.ArrayList;
import java.util.List;
public class BasicCollectionsExample {
public static void main(String\[] args) {
// 初始化动态整数列表
List<Integer> numbers = new ArrayList<>();
// 添加元素
numbers.add(10);
numbers.add(20);
numbers.add(30);
// 使用增强型 for 循环遍历
for (Integer num : numbers) {
System.out.println("Number: " + num);
}
// 根据索引访问元素
System.out.println("第一个元素: " + numbers.get(0));
// 安全删除元素
numbers.remove(Integer.valueOf(20));
// 检查大小和内容
System.out.println("列表大小: " + numbers.size());
System.out.println("列表内容: " + numbers);
}
}
上述代码演示了 Java 集合的基本使用,使用 ArrayList 实现动态数组。首先通过 List 接口声明集合,体现多态设计,可灵活切换底层实现。ArrayList 提供动态扩展和快速随机访问,对于需要频繁读取的场景非常高效。
add() 方法演示了如何安全添加元素,避免手动管理数组容量。增强型 for 循环提高了代码可读性,避免索引操作错误。get(0) 展示了 O(1) 随机访问特性,对算法性能分析至关重要。remove(Integer.valueOf(20)) 强调类型安全,避免使用索引删除导致的逻辑错误。最后,通过 size() 和打印列表内容,可以直观检查集合状态,有助于调试和监控。在实际项目中,这些基础操作为更复杂的数据处理、算法实现和系统架构应用奠定基础。
实用示例
javaimport java.util.*;
class Product {
private String name;
private double price;
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() { return name; }
public double getPrice() { return price; }
@Override
public String toString() {
return name + " ($" + price + ")";
}
}
public class CollectionsPracticalExample {
public static void main(String\[] args) {
// 使用 TreeSet 按价格排序产品
Set<Product> products = new TreeSet<>(Comparator.comparingDouble(Product::getPrice));
products.add(new Product("Laptop", 1200.50));
products.add(new Product("Phone", 799.99));
products.add(new Product("Tablet", 450.00));
// 显示排序后的产品
System.out.println("按价格排序的产品:");
products.forEach(System.out::println);
// 使用流筛选价格高于阈值的产品
double threshold = 500.0;
List<Product> expensiveProducts = products.stream()
.filter(p -> p.getPrice() > threshold)
.toList();
System.out.println("高价产品:");
expensiveProducts.forEach(System.out::println);
}
}
Advanced Implementation
javaimport java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class AdvancedCollectionsExample {
public static void main(String\[] args) {
// 并发安全 Map
Map\<String, List<String>> userRoles = new ConcurrentHashMap<>();
// 添加用户及其角色
userRoles.put("alice", new ArrayList<>(Arrays.asList("admin", "editor")));
userRoles.put("bob", new ArrayList<>(Arrays.asList("viewer")));
userRoles.put("charlie", new ArrayList<>());
// 使用 computeIfAbsent 安全更新角色
userRoles.computeIfAbsent("charlie", k -> new ArrayList<>()).add("editor");
// 使用 forEach 和方法引用迭代
userRoles.forEach((user, roles) -> {
System.out.println(user + " 角色: " + roles);
});
// 异常处理示例
try {
List<String> roles = userRoles.get("dave");
if (roles != null) {
System.out.println("Dave 的角色: " + roles);
} else {
System.out.println("用户 dave 不存在。");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
使用 Java 集合的最佳实践包括:选择适合的数据结构,保持类型安全,减少性能开销。应优先使用接口(List、Set、Map)而非具体实现,以增强灵活性和可维护性。迭代时推荐增强型 for 循环或流(Stream),提高可读性并避免并发修改异常。删除元素应安全操作,避免手动索引操作引发错误。
常见问题包括内存泄漏(未及时释放引用)、低效算法(嵌套循环处理大数据集)、错误处理不当(访问空或不存在的元素)。调试应重点关注集合状态、边界检查和日志记录。性能优化需考虑操作时间复杂度:使用 HashMap 实现 O(1) 查找,LinkedList 对频繁插入/删除操作高效,TreeSet 用于保持排序。安全性方面,使用不可修改集合包装器(unmodifiable)保护数据,或使用并发集合(ConcurrentHashMap)确保多线程安全。
📊 完整参考
Property/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
add(E e) | 向集合添加元素 | collection.add(element) | numbers.add(10) | 适用于 List、Set |
remove(Object o) | 删除指定元素 | collection.remove(element) | numbers.remove(Integer.valueOf(20)) | 避免索引删除混淆 |
get(int index) | 根据索引获取元素 | list.get(index) | numbers.get(0) | 仅适用于 List |
size() | 返回元素数量 | collection.size() | numbers.size() | 通用方法 |
isEmpty() | 检查集合是否为空 | collection.isEmpty() | numbers.isEmpty() | 用于循环保护 |
contains(Object o) | 检查元素是否存在 | collection.contains(element) | numbers.contains(30) | List 为线性查找 |
clear() | 清空集合 | collection.clear() | numbers.clear() | 避免内存泄漏 |
iterator() | 获取迭代器 | Iterator<E> it = collection.iterator() | Iterator<Integer> it = numbers.iterator() | 支持高级迭代 |
forEach(Consumer<? super E> action) | Lambda 遍历 | collection.forEach(e -> ...) | numbers.forEach(System.out::println) | 函数式编程 |
toArray() | 集合转数组 | collection.toArray() | Object[] arr = numbers.toArray() | 兼容老 API |
stream() | 生成 Stream | collection.stream() | numbers.stream().filter(n -> n>10) | 支持并行处理 |
parallelStream() | 生成并行 Stream | collection.parallelStream() | numbers.parallelStream().forEach(...) | 多核优化 |
addAll(Collection<? extends E> c) | 批量添加 | collection.addAll(other) | numbers.addAll(otherList) | 高效批量操作 |
removeAll(Collection<?> c) | 移除多个元素 | collection.removeAll(other) | numbers.removeAll(toRemove) | 数据过滤 |
retainAll(Collection<?> c) | 保留集合交集 | collection.retainAll(other) | numbers.retainAll(toKeep) | removeAll 的逆操作 |
containsAll(Collection<?> c) | 检查是否包含所有元素 | collection.containsAll(other) | numbers.containsAll(required) | 用于验证 |
equals(Object o) | 集合比较 | collection.equals(other) | numbers.equals(otherNumbers) | List 顺序敏感 |
hashCode() | 返回哈希码 | collection.hashCode() | int hash = numbers.hashCode() | 哈希集合必备 |
addFirst(E e) | 在开头添加 | linkedList.addFirst(e) | linkedList.addFirst(5) | LinkedList 专用 |
addLast(E e) | 在末尾添加 | linkedList.addLast(e) | linkedList.addLast(10) | LinkedList 专用 |
getFirst() | 获取第一个元素 | linkedList.getFirst() | linkedList.getFirst() | LinkedList 专用 |
getLast() | 获取最后一个元素 | linkedList.getLast() | linkedList.getLast() | LinkedList 专用 |
offer(E e) | 队列入队 | queue.offer(e) | queue.offer(15) | 满队返回 false |
poll() | 队列出队 | queue.poll() | Integer head = queue.poll() | 空队返回 null |
peek() | 查看队首元素 | queue.peek() | Integer head = queue.peek() | 空队返回 null |
push(E e) | 栈压入 | stack.push(e) | stack.push(20) | 栈专用 |
pop() | 栈弹出 | stack.pop() | Integer top = stack.pop() | 空栈抛异常 |
peek() | 栈查看顶 | stack.peek() | Integer top = stack.peek() | 栈专用 |
computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) | 若键不存在则计算 | map.computeIfAbsent(key, k -> new ArrayList<>()) | userRoles.computeIfAbsent("dave", k -> new ArrayList<>()) | 初始化便捷 |
put(K key, V value) | 添加键值对 | map.put(key,value) | map.put("alice", list) | Map 专用 |
get(Object key) | 获取键对应值 | map.get(key) | map.get("alice") | 键不存在返回 null |
remove(Object key) | 删除键值对 | map.remove(key) | map.remove("bob") | Map 专用 |
keySet() | 获取键集合 | map.keySet() | Set<String> keys = map.keySet() | 迭代友好 |
values() | 获取值集合 | map.values() | Collection<List<String>> vals = map.values() | 迭代友好 |
entrySet() | 获取条目集合 | map.entrySet() | Set<Map.Entry<String,List<String>>> entries = map.entrySet() | 支持迭代处理 |
merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction) | 合并键值 | map.merge("alice", newList, (oldV,newV)->oldV.addAll(newV)) | 高效合并列表 | 避免覆盖数据 |
replace(K key, V value) | 替换值 | map.replace("alice", newList) | 更新映射 | 键不存在返回 null |
replaceAll(BiFunction<? super K,? super V,? extends V> function) | 批量更新 | map.replaceAll((k,v)->v) | 批量修改 | 函数式操作 |
Collections.sort(List<T> list) | 排序列表 | Collections.sort(list) | Collections.sort(numbers) | 原地排序 |
Collections.reverse(List<?> list) | 反转列表 | Collections.reverse(list) | Collections.reverse(numbers) | 算法辅助 |
Collections.shuffle(List<?> list) | 随机打乱 | Collections.shuffle(list) | Collections.shuffle(numbers) | 随机化算法 |
Collections.unmodifiableList(List<? extends T> list) | 返回不可修改视图 | List<Integer> unmod = Collections.unmodifiableList(numbers) | 防止外部修改 | 安全措施 |
Collections.synchronizedList(List<T> list) | 线程安全包装 | List<Integer> syncList = Collections.synchronizedList(numbers) | 多线程安全 | 迭代需同步 |
Collections.binarySearch(List<? extends Comparable<? super T>> list, T key) | 二分查找 | int idx = Collections.binarySearch(numbers, 20) | 需排序 | O(log n) |
Collections.frequency(Collection<?> c, Object o) | 统计元素出现次数 | Collections.frequency(numbers, 10) | 分析工具 | O(n) |
Collections.max(Collection<? extends T> c) | 获取最大值 | Collections.max(numbers) | Comparable 支持 | 算法常用 |
Collections.min(Collection<? extends T> c) | 获取最小值 | Collections.min(numbers) | Comparable 支持 | 算法常用 |
Collections.addAll(Collection<? super T> c, T... elements) | 批量添加 | Collections.addAll(numbers, 1,2,3) | 减少循环 | 高效 |
Collections.copy(List<? super T> dest, List<? extends T> src) | 复制列表 | Collections.copy(dest, src) | dest 大小必须足够 | 避免 IndexOutOfBounds |
Collections.rotate(List<?> list, int distance) | 旋转列表 | Collections.rotate(numbers, 2) | 算法辅助 | 循环移动 |
Collections.fill(List<? super T> list, T obj) | 填充元素 | Collections.fill(numbers, 0) | 初始化工具 | 覆盖所有元素 |
Collections.nCopies(int n, T obj) | 创建不可变列表 | List<Integer> zeros = Collections.nCopies(5,0) | 只读 | 固定大小 |
Collections.disjoint(Collection<?> c1, Collection\<?> c2) | 判断无交集 | Collections.disjoint(list1,list2) | 布尔值 | 验证用途 |
Collections.emptyList() | 返回空列表 | Collections.emptyList() | List<Integer> empty = Collections.emptyList() | 不可变 |
Collections.emptySet() | 返回空集合 | Collections.emptySet() | Set<String> emptySet = Collections.emptySet() | 不可变 |
Collections.emptyMap() | 返回空 Map | Collections.emptyMap() | Map\<String,Integer> emptyMap = Collections.emptyMap() | 不可变 |
Collections.singleton(T o) | 单元素集合 | Collections.singleton(1) | 不可变 | 常量用途 |
Collections.singletonList(T o) | 单元素列表 | Collections.singletonList("one") | 不可变 | 线程安全 |
Collections.singletonMap(K key, V value) | 单元素 Map | Collections.singletonMap("k","v") | 不可变 | 线程安全 |
Collections.reverseOrder() | 逆序比较器 | Collections.sort(list, Collections.reverseOrder()) | 降序排序 | 函数式 |
Collections.nCopies() | 创建不可变副本列表 | List<String> list = Collections.nCopies(3,"A") | 不可变 | 占位用途 |
Collections.addAll() | 批量高效添加 | Collections.addAll(list, 1,2,3) | 减少循环 | 高性能 |
Collections.frequency() | 统计元素次数 | Collections.frequency(list,10) | 分析工具 | O(n) |
Collections.max() | 获取最大值 | Collections.max(list) | Comparable 支持 | 算法辅助 |
Collections.min() | 获取最小值 | Collections.min(list) | Comparable 支持 | 算法辅助 |
Collections.copy() | 复制列表 | Collections.copy(dest,src) | 确保 dest 足够大 | 避免越界 |
Collections.rotate() | 旋转元素 | Collections.rotate(list,2) | 调度或算法用途 | 循环移位 |
Collections.shuffle() | 随机打乱 | Collections.shuffle(list) | 随机算法 | O(n) |
Collections.sort() | 排序列表 | Collections.sort(list) | 原地排序 | O(n log n) |
Collections.reverse() | 反转列表 | Collections.reverse(list) | 算法辅助 | O(n) |
Collections.synchronizedList() | 线程安全列表 | Collections.synchronizedList(list) | 多线程 | 迭代需同步 |
Collections.unmodifiableList() | 不可变列表 | Collections.unmodifiableList(list) | 安全 | 防修改 |
Collections.unmodifiableSet() | 不可变集合 | Collections.unmodifiableSet(set) | 防修改 | 安全 |
Collections.unmodifiableMap() | 不可变 Map | Collections.unmodifiableMap(map) | 防修改 | 安全 |
Collections.binarySearch() | 二分查找 | Collections.binarySearch(list,key) | 需排序 | O(log n) |
Collections.disjoint() | 无交集判断 | Collections.disjoint(list1,list2) | 布尔值 | 验证用途 |
Collections.singletonList() | 单元素列表 | Collections.singletonList("one") | 不可变 | 线程安全 |
Collections.singletonMap() | 单元素 Map | Collections.singletonMap("k","v") | 不可变 | 线程安全 |
📊 Complete Properties Reference
Property | Values | Default | Description | Browser Support |
---|---|---|---|---|
ArrayList | 动态数组 | 空 | 可调整大小的数组列表 | 所有 JVM |
LinkedList | 双向链表 | 空 | 插入/删除高效 | 所有 JVM |
HashSet | 哈希表实现 | 空 | 唯一元素,无序 | 所有 JVM |
TreeSet | 红黑树实现 | 空 | 排序唯一元素 | 所有 JVM |
HashMap | 哈希表 Map | 空 | 键值存储,快速查找 | 所有 JVM |
TreeMap | 红黑树 Map | 空 | 排序键值对 | 所有 JVM |
ConcurrentHashMap | 线程安全 Map | 空 | 并发访问支持 | 所有 JVM |
Stack | 栈 | 空 | LIFO 操作 | 所有 JVM |
Queue | 队列 | 空 | FIFO 操作 | 所有 JVM |
PriorityQueue | 优先队列 | 空 | 按优先级排序 | 所有 JVM |
Vector | 同步动态数组 | 空 | 遗留线程安全类 | 所有 JVM |
Collections.unmodifiableList | 不可变列表 | N/A | 防止修改 | 所有 JVM |
掌握 Java 集合可以让开发者高效管理数据、实现复杂算法,并构建可靠的后端系统。集合提供多种数据结构:列表、集合、映射、队列等,可根据任务需求选择合适类型,平衡性能与功能。高级使用包括排序、过滤、线程安全、不可变集合及流处理,这些在企业级应用中尤为重要。
下一步学习可深入并发集合、特殊结构如 LinkedHashMap、WeakHashMap,以及集合与函数式编程(Stream)的结合。实践建议:始终根据算法需求选择合适集合类型,防止内存泄漏,优化访问模式。持续学习资源包括官方 Java 文档、后端教程和开源项目。掌握集合为高级数据结构、算法设计和系统架构奠定坚实基础。
🧠 测试您的知识
测试您的知识
通过实际问题测试您对这个主题的理解。
📝 说明
- 仔细阅读每个问题
- 为每个问题选择最佳答案
- 您可以随时重新参加测验
- 您的进度将显示在顶部