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()
的区别)。