网站首页 > java教程 正文
概念
JDK5增加了可变参数方法(variable arity method)
可变参数方法接受0个或多个指定类型的参数。
可变参数机制:先创建一个数组,数组大小为调用位置所传递的参数数量,然后将参数值传递到数组中,最后将数组传递给方法。
问题的提出
编写需要一个或多个某种类型参数的方法,而不是需要零个或多个参数。例如求多个int
参数的最小值。可变参数方法不适合这种场景。
问题:如果客户端调用这个方式时,没有传递参数,会在运行时而不是编译时失败;代码不美观。必须对args
进行显示的有效性检查,除非将min
初始化为Integer.MAX_VALUE
,否则无法使用for-each循环。
问题的解决办法
声明该方法带有两个参数,一个是指定类型的正常参数,另一个是这种类型的varargs参数。
可变参数的适用场景
当真正需要一个方法带有不定数量的参数时,可变参数就非常有效。
可变参数是为printf
而设计的,它是在jdk5引入的。
printf
和反射机制都从可变参数中获得极大的收益。
错误的例子 Arrays.asList增强为可使用可变参数
可以将以final
数组作为参数的方法,改造成可变参数版本。但是不应该这么做。
Arrays.asList方法不是设计用来将多个参数集中到一个列表中的。
上面打印数组内容的方法只在对象引用类型的数组上才有用。
在JDK5之前,Arrays.asList()在基本类型的数组上用将无法编译。
现在的版本呢?
通过对比,可以发现,传入基本数据类型的数组也是可以通过编译的,但是运行这个程序,会输出无意义的结果。
Arrays.asList方法将int类型的数组的引用集中到单个元素数组中,并封装成List<int[]>。
将数组转变为字符串的Arrays.asList
已经过时了。Arrays
类有专门将任何类型的数组转变为字符串的方法。
//The right way to print an arraySystem.out.println(Arrays.toString(digits));
如果不改造Arrays.asList
,更好的办法是给Collections
添加一个新的方法,专门用来将它的参数集中到列表中。
这种方法可以提供收集功能,而不会危及对现有Arrays.asList
方法的类型检查。
不必改造具有final
数组参数的每个方法;只当确实是在数量不定的值上执行调用时才使用可变参数。
可变参数的性能问题
每次调用可变参数方法都会进行一次数组分配和初始化。
解决办法——重载:
假设确定对某个方法95%的调用会有3个或者更少的参数,就声明该方法的5个重载,每个重载方法带有0至3个普通参数,当参数的数目超过3个时,就使用一个可变参数方法。
所有的调用只有5%参数数量超过3个的调用需要创建数组。
EnumSet
类对它的静态工厂使用了这种方法,最大限度地减少创建枚举集合的成本,枚举集合为位域提供在性能方面有竞争性的代替方法。
猜你喜欢
- 2024-11-06 35个编码小细节,助你有效提升Java代码的执行效率!网友:学到了
- 2024-11-06 35个Java 代码优化细节(seo 代码优化)
- 2024-11-06 Java 性能优化:35 个小细节,提升你的 Java 代码运行效率
- 2024-11-06 二十二、Java中的函数与方法(java 函数)
- 2024-11-06 java高级用法之:JNA类型映射应该注意的问题
- 2024-11-06 最全面的44个Java性能调优细节(四个全面中哪个最具有基础性)
- 2024-11-06 尚学堂知识整理:java可变长度数组
- 2024-11-06 阿里强制要求的21条Java开发规范,可以避免很多坑
- 2024-11-06 面试题:为什么 Java 中的 String 被设计为不可变类?
- 2024-11-06 第五章:Java方法和参数传递(java中方法的参数传递是什么调用)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)