当前位置: 首页 > news >正文

Java 可变参数机制

基本语法和使用

1. 基本语法

public class VarargsExample {// 可变参数声明:类型... 参数名public static int sum(int... numbers) {int total = 0;for (int num : numbers) {total += num;}return total;}// 可变参数必须放在最后public static void printInfo(String message, int... values) {System.out.print(message + ": ");for (int val : values) {System.out.print(val + " ");}System.out.println();}public static void main(String[] args) {// 多种调用方式System.out.println(sum(1, 2, 3));        // 6System.out.println(sum(1, 2, 3, 4, 5)); // 15System.out.println(sum());               // 0 - 空参数System.out.println(sum(10));             // 10 - 单个参数// 也可以传递数组int[] arr = {1, 2, 3};System.out.println(sum(arr));            // 6printInfo("数值", 1, 2, 3, 4);}
}

2. 编译器的处理

// 编译前
public void method(String... args)
// 编译后等价于
public void method(String[] args)

实际应用场景分析

  1. 工具类和辅助方法 - 提供简洁的API

  2. 日志和格式化 - 参数数量变化大

  3. 测试代码 - 可读性和便利性更重要

  4. 配置和构建器 - 灵活的调用方式

现代Java的改进

1. 结合Stream API

public class ModernVarargs {// 可变参数 + Stream = 强大组合
    @SafeVarargspublic static <T> List<T> mergeLists(List<T>... lists) {return Arrays.stream(lists).flatMap(List::stream).collect(Collectors.toList());}// 处理null安全的可变参数public static <T> void printValues(T... values) {Arrays.stream(values).filter(Objects::nonNull).forEach(System.out::println);}
}// 使用记录类(Java 16+)
record Point(int x, int y) {// 可变参数构造器public static Point of(int... coordinates) {return coordinates.length >= 2 ? new Point(coordinates[0], coordinates[1]) : new Point(0, 0);}
}

2. 与容器API的互操作

可以使用传容器传参的方式代替

public class Interoperability {// 最佳实践:同时提供两种版本public static class ApiDesign {// 可变参数版本 - 方便调用public static void execute(Runnable... tasks) {execute(Arrays.asList(tasks));}// 容器版本 - 性能更好public static void execute(List<Runnable> tasks) {tasks.forEach(Runnable::run);}}public static void demo() {// 根据情况选择合适的方法Runnable task1 = () -> System.out.println("Task 1");Runnable task2 = () -> System.out.println("Task 2");// 少量固定任务 - 使用可变参数
        ApiDesign.execute(task1, task2);// 动态生成的任务列表 - 使用容器List<Runnable> dynamicTasks = generateTasks();ApiDesign.execute(dynamicTasks);}
}

性能考虑

可变参数会创建数组,在热点代码中可能有影响
每次调用都会创建新数组

对于性能敏感的场景,考虑重载方法
 
 
 
http://www.jsqmd.com/news/41971/

相关文章:

  • 11 月 3 日
  • 002 vue3-admin项目的目录及文件说明之src目录及其子目录、子文件
  • 全国性搬家公司推荐榜:从运费优势、专业度、靠谱口碑、费用便宜划算等综合实力排名
  • C# 高级类型 Dictionary(学习笔记4)
  • Java 垃圾收集机制
  • Metasploit Framework 6.4.99 (macOS, Linux, Windows) - 开源渗透测试框架
  • 小程序获取OCR识别结果,示例代码
  • 20232405 2024-2025-1 《网络与系统攻防技术》实验五实验报告
  • Invicti v25.11 发布,新增功能简介
  • Acunetix v25.11 发布,新增功能简介
  • 【运维自动化-标准运维】变量的高级用法
  • MySQL数据过滤与计算字段实战技术指南
  • 2025-11-14 PQ v.Next日志记录
  • 详细介绍:K8s 安全机制全解析
  • 详细介绍:MySQL索引指南
  • 实用指南:【第五章:计算机视觉-项目实战之推荐/广告系统】1.推荐系统基础与召回算法-(6)召回算法之u2i: FM、deepFM、召回双塔原理精讲与实战
  • 微前端架构演进:决策、实践与协同
  • OI 技术动作 注意事项集合
  • Java 设计模式—— 责任链模式:从原理到 SpringBoot 最优搭建
  • 大模型基础补全计划(七)---Transformer(多头注意力、自注意力、位置编码)及实例与测试
  • 京东商品详情接口终极突破:从多接口联动解析到数据全息重构
  • 实用指南:On-Page SEO完全指南:从关键词策略到内容优化
  • 2025年品质卓越的羊毛地毯品牌综合推荐与选购指南
  • dfad
  • 2025年品质卓越的羊毛地毯工厂综合推荐与选择指南
  • 20232415 2025-2026-1 《网络与系统攻防技术》 实验五实验报告
  • CSP2025反思——于诗涵
  • 接雨水算法全解析:从错误到3种最优解法(含扩展与思路Trigger)
  • 详细介绍:Android APK签名机制的工作原理、结构差异、安全局限与优势
  • Java位运算符概览