java——慎用可变参数列表

说起可变参数,我们先看下面代码段,对它有个直观的认识,下方的红字明确地解释了可变参数的意思:

 1 public class VarargsDemo{
 2
 3     static int sum(int... args) {
 4         int sum = 0;
 5         for(int arg:args)
 6             sum += arg;
 7         return sum;
 8     }
 9     public static void main(String args[]) throws FileNotFoundException {
10         System.out.println(sum(1,2,3,4,5,6,7,8,9,10));           System.out.println(sum(1,2,3,4,5,6));           System.out.println(sum(1,2,3);
11     }
12 }

可变参数的机制原理:

1.创建一个array[],它的size就是所传参数的个数;

2.将参数放入到array[]中;

3.将array[]传给方法。

看起来这个可变参数非常的便利,我们不用去考虑参数的个数,随心所欲的使用。但是这个观点不对,它给我带来便利的同时,也有很多潜在的危险,我们要慎重使用。

1.如果所传参数为null,方法里有对参数的引用(比如 args[0])时,那么就会在运行时失败(编译时却检测不出错误);

2.在对性能有要求时,我们要慎重考虑是否使用可变参数。因为,可变参数方法的调用都会引起array的内存分配和初始化,这会给性能带来损耗。

解决方案:

假设调用可变参数的方法中,有95%只是调用参数个数小于4,那么就可以将个数小于4的方法,用普通方法定义;剩余的5%,调用可变参数方法。

1     public void foo() {}
2     public void foo(int a1) {}
3     public void foo(int a1, int a2) {}
4     public void foo(int a1, int a2, int a3) {}
5     public void foo(int a1, int a2, int a3, int... rest) {}

3.在打包作业时,还有一点需要注意。

当可变参数的使用发生变动时(比如:以前用可变参数方法,现在用普通方法),所有引用参数列表的类的.class都要重新生成,因为可变参数的array的分配和初始化是在编译期间完成的。

参考文献:

《Effective Java》 第三版 Item 53

原文地址:https://www.cnblogs.com/lihao007/p/10325855.html

时间: 2024-09-30 20:55:12

java——慎用可变参数列表的相关文章

16 可变参数列表和重载问题(最后选择可变参数列表)

package com.wys.java; /** * 关于可变参数列表和重载问题 * @author snape * @version 1.0 * */ public class ArgsDemo2 { //可变参数列表所在方法是最后被访问的 //带可变参数的方法 public int plus(int n, int m){ System.out.println("不带可变参数的方法被调用"); return m+n; } //不带可变参数的方法 public int plus(in

Java 可变参数列表

1.可变参数列表的简单实现 当调用方法时,方法的参数个数或类型未知时,称其为可变参数列表.在以前的Java代码中,可以使用Object数组来实现这样的功能.因为,所有的类都是直接或间接继承于Object类. VarArgs.java package sample; class A1{} public class VarArgs { static void printArray(Object[] args){ for(Object obj:args) System.out.print(obj+"

可变参数列表-Java SE5新特性(转)

Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多于一个时,必将有一个不是最后一项,所以只支持有一个可变参数.因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项. 可变参数的特点:(1)只能出现在参数列表的最后: (2)...位于变量类型和变量名之间,前后有无空格都可以:(3)调用可变参数的方法时,编译

java可变参数列表的实现

参数就是我们调用一个方法时需要传入得数据,在方法中可能需要参数协助处理数据或者对参数进行解析处理以达到我们希望得到的数据和结果. 平常我们在写一个方法时,我们能确定需要传入什么样的参数以及参数的个数,这样我们在实现这个方法的时候在确定参数的时候都会有明确的目标.但是有时候会有这种特殊情况,我们并不知道我们将要传入几个参数,或者说我们并不确定外部会传入多少参数.在这种情况下,我们就要用到可变参数列表.下面是可变参数方法的实现方法. 1.传入数组对象或者集合,这里只对传入数组对象进行简单说明,集合的

java基础基础总结----- 构造方法,可变参数列表

1 package com.mon11.day2; 2 /** 3 * 类说明 :构造方法,可变参数列表 4 * @author 作者 : chenyanlong 5 * @version 创建时间:2017年11月2日 6 */ 7 class Employee{ 8 private double salary=1800; 9 10 //构造方法 11 public Employee(){ 12 System.out.println("构造方法被调用"); 13 } 14 15 //

五分钟学Java:可变参数究竟是怎么一回事?

在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常值得深入地研究一下. 我以前很不重视基础,觉得不就那么回事嘛,会用就行了.就比如说今天这个主题,管它可变不可变呢,不就是个参数嘛,还能有多大学问--抱着这种态度,我一直横行江湖近十载(苦笑).可等到读者找我提一些基础的问题时,我几乎回答不上来,感觉知识是散的,或者是浮于表面的.幸好最近一段时间,我开始幡然醒悟,开始不放过任何一个细节,渐渐地,有点"

15 可变参数列表

可变参数的应用: 一个方法中只能有一个可变参数: 可变参数必须在参数列表的最后一个位置: 参数列表中(形参是可变参数,实参为数组)是可行的,但反过来不行. package com.wys.java; public class ArgsDemo { /** * 一个方法中只能有一个可变参数: * 可变参数必须在参数列表的最后一个位置: * 参数列表中(形参是可变参数,实参为数组)是可行的,但反过来不行. * @param n */ //可变参数列表: //求和,参数个数不确定 public voi

可变参数列表的实现

在学习C语言的过程中,大家是不是和我一样,认为printf是一个神一样的函数?他可以接受不同数目,不同类型的参数,他到底是怎么实现的呢? 让我们去看一下它的源代码: printf源代码: int printf(const char *fmt,...) { int res; va_list arg; va_start(arg,fmt); res = vprintf(fmt,arg); va_end(arg); return res; } 它采用的是可变参数列表,可变参数列表主要有以下两个缺点: 1

【C语言】求多个数中的最大值(可变参数列表)

求多个数中的最大值要求用可变参数列表: 代码如下: <span style="font-size:18px;">#include<stdio.h> #include<stdarg.h> int Max(int n,...) { int i=0; int max=0; va_list arg; va_start(arg,n); for(i=0;i<n;i++) { int val=va_arg(arg,int); if (val>max)