Java可变参数与Collections工具类详解
Java可变参数与Collections工具类详解
一、可变参数(Variable Arguments)
1.1 基本概念
可变参数是Java 5引入的特性,允许在方法中定义数量可变的形参。其核心特点是:形参个数可以动态变化(0个、1个、多个),底层由数组实现,但开发者无需手动创建数组。
语法格式:
数据类型... 参数名
// 示例:
public static int sum(int... nums) { ... }
1.2 使用示例
public class ArgsDemo {public static void main(String[] args) {int sum = getSum(1, 2, 3, 4, 5); // 传递任意个参数System.out.println("Sum: " + sum); // 输出15}public static int getSum(int... nums) {int sum = 0;for (int num : nums) {sum += num;}return sum;}
}
1.3 注意事项
- 只能有一个可变参数:方法形参中最多只能包含一个可变参数。
- 必须放在最后:如果方法有其他形参,可变参数需放在末尾。
- 与数组的区别:调用时无需显式创建数组,Java自动封装参数为数组。
❌ 错误示例:
// 编译错误:可变参数不在末尾
public static void errorMethod(int... nums, String str) { ... }// 编译错误:多个可变参数
public static void errorMethod(int... nums1, String... strs) { ... }
二、Collections工具类
2.1 核心作用
java.util.Collections
是集合操作的工具类,提供了一系列静态方法用于集合的增删改查、排序、查找等操作。
2.2 常用API详解
方法名称 | 说明 | 示例 |
---|---|---|
addAll(Collection<T> c, T... elements) | 批量添加元素 | Collections.addAll(list, "A", "B", "C"); |
shuffle(List<?> list) | 随机打乱集合顺序 | Collections.shuffle(list); |
sort(List<T> list) | 自然顺序排序(升序) | Collections.sort(numbers); |
sort(List<T> list, Comparator<T> c) | 自定义规则排序 | Collections.sort(students, Comparator.comparing(Student::getAge)); |
binarySearch(List<T> list, T key) | 二分查找元素索引 | int index = Collections.binarySearch(list, 5); |
copy(List<T> dest, List<T> src) | 拷贝集合元素 | Collections.copy(destList, srcList); |
reverse(List<?> list) | 反转集合顺序 | Collections.reverse(list); |
max(Collection<T> coll) | 获取最大值(自然排序) | int max = Collections.max(numbers); |
2.3 代码演示
import java.util.ArrayList;
import java.util.Collections;public class CollectionsDemo {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();// 批量添加元素Collections.addAll(list, "A", "B", "C", "D");System.out.println("原始列表: " + list); // [A, B, C, D]// 打乱顺序Collections.shuffle(list);System.out.println("打乱后: " + list); // 如 [B, D, A, C]// 排序Collections.sort(list);System.out.println("排序后: " + list); // [A, B, C, D]}
}
2.4 补充知识点
- 集合填充:
Collections.fill(list, "X")
将集合所有元素替换为指定值。 - 交换元素:
Collections.swap(list, 0, 1)
交换索引0和1的元素。 - 线程安全集合:通过
Collections.synchronizedList(list)
将普通集合转为线程安全版本。
三、综合应用场景
场景1:斗地主发牌(集合嵌套)
// 使用可变参数初始化牌组
public static List<String> initPoker(String... colors) {List<String> poker = new ArrayList<>();for (String color : colors) {for (int i = 1; i <= 13; i++) {poker.add(color + i);}}return poker;
}// 调用
List<String> poker = initPoker("♠", "♥", "♣", "♦");
Collections.shuffle(poker); // 洗牌
场景2:动态参数统计
public static void printNames(String... names) {if (names.length == 0) {System.out.println("无名氏");} else {Arrays.stream(names).forEach(System.out::println);}
}
四、总结对比
特性 | 可变参数 | Collections工具类 |
---|---|---|
核心功能 | 动态传递多个参数 | 提供集合操作的静态工具方法 |
底层实现 | 自动封装为数组 | 基于集合接口实现功能扩展 |
典型应用 | 简化多参数方法的调用 | 排序、查找、线程安全转换等 |
学习建议:
- 灵活使用可变参数优化多参方法。
- 掌握Collections工具类的常用API,提升集合操作效率。
- 结合源码理解底层实现(如
Arrays.asList()
与Collections.addAll()
的区别)。