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

 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

java——慎用可变参数列表相关推荐

  1. java 可变参数列表_java的可变参数列表

    关于java的可变参数列表 1.简介: java的可变参数列表是的从jdk1.5开始新增的,其英文名词varargs 2.作用 可以传未知个数的参数,无需手动将参数列表装入数组 3.语法 //可变参数 ...

  2. java 可变参数列表_java中可变参数列表的实现方法

    我们在对可变参数有一定的认识后,可以引申一下它的使用范围.在数组中也会需要参数的传入,那么结合参数的数量不固定,我们在参数类型上也得到了增加,这就是本篇所要讲的可变参数列表.下面我们就java可变参数 ...

  3. java基础(九) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型-(三个点) 例如: void printArray(Object...) 注意: 每个方法最多只有一个可变参数 ...

  4. java 可变参数列表 数组_java可变参数列表如何填充数组?

    在对于数组的填充上,我们可以运行参数的传递,把数组作为可变参数的列表进行调整.对于一些参数个数和类型未知的时候,这种方法就能帮助我们解决填充数组的难题,因为这种方法并不需要提前知道.下面我们就可变参数 ...

  5. Java可变参数列表

    可变参数列表主要是指参数数量的可变,可以使一个到多个 package www.zxx;import java.util.Scanner;public class test {public static ...

  6. java 可变参数列表

    Java SE5添加了可变参数列表特性 参数可以这样定义,(Object-args).可变参数用"..."来定义,args是可变参数的数组.举个例子: package sample ...

  7. java基础篇(10) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型-(三个点) 例如: void printArray(Object-) 注意: 每个方法最多只有一个可变参数,因 ...

  8. 论java中可变参数

    论java中可变参数 /*** ...可变参数* 当... 作为形参时,传入的实参是可变的* 在方法体内部,仍然可将可变参数当成数组使用* 如果传入的实参是多个单独的变量,程序会自动将多个单独的变量放 ...

  9. 灵魂拷问:Java的可变参数究竟是怎么一回事?

    这是 Java 极客技术的第 276 篇原创文章 在逛 programcreek 的时候,我发现了一些专注基础但不容忽视的主题.比如说:Java 的可变参数究竟是怎么一回事?像这类灵魂拷问的主题,非常 ...

最新文章

  1. R语言names函数获取或者设置数据对象名称实战
  2. 安卓中AIDL的使用方法快速入门
  3. 深度学习CTR模型最全演化图谱 [王喆观点]
  4. 解决Chrome浏览器高版本无法拖拽离线安装CRX格式插件的问题
  5. Flask 在 Debug 模式下初始化2次
  6. ajax+webservice
  7. 活动预告 | 2020移动云客户高端峰会即将揭幕,邀您一起携手云端!
  8. netty冲突 play sbt_《Netty官方文档》本地传输接口
  9. 什么是数据?数据科学家需要掌握哪些技能?终于有人讲明白了
  10. 设计模式学习-每日一记(1.简单工厂模式)
  11. hive 配置用户名_Hive的安装及配置
  12. 【以前的空间】vijos 1720 阿狸的打字机
  13. JS等比例缩小图片尺寸
  14. UDS学习笔记(六)——程序刷写
  15. 人人开源的遇到的错误
  16. 字符串匹配算法知多少?
  17. python 12306登录_Python Selenium自动登录12306官网
  18. Dorado7的初次使用
  19. nextcloud私有云盘搭建
  20. noip2016普及组初赛中山市成绩表及分数线

热门文章

  1. SSL 1460——最小代价问题
  2. JZOJ #4722 跳楼机 (最短路模型的完美转化)
  3. 搭建turnserver
  4. 与技术无关的书单--你可以笑着说有些是“精神鸦片”
  5. 挖坑挖到cnblogs.com来...
  6. (转)linux下oracle instant client安装和运行
  7. 结构成员访问的三种方法
  8. 浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)
  9. 指针的本质--u_char*指针在Nginx源码中的应用及原因
  10. 深度学习中的验证集和超参数简介