Java 1.5增加可变参数方法,可变参数方法接受0个或者多个指定类型的参数。
可变参数的机制是通过先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到数组中,最后将数组传递给方法

static int sum(int... args) {int sum=0;for(int arg : args)sum += arg;return sum;
}

但是,不传参也是可以的,这样容易导致错误的出现,所以常见的策略是首先指定正常参数,把可选参数放在后面。

//可变参数必须放在参数列表的最后
static int min(int firstArg, int... remainingArgs) {int min = firstArg;for(int arg : remainingArgs)if(arg < min)min = arg;return min;
}

滥用参数列表的例子:
jdk1.5以前:Array.asList是这样的

public static  List< Object > asList(Object[]obj) {return new ArrayList< Object >(obj);
}

我们想要打印对象引用数组一般这样用Arrays.asList(),因为直接调用数组的toString()会产生没有意义的结果,如下:

String[]strings = {"12","23","34","56"};System.out.println(Arrays.asList(strings));//[12, 23, 34, 56]System.out.println(strings.toString());//[Ljava.lang.String;@3d4eac69

所以当

int[]ints = {12,23,34,56};
System.out.println(Arrays.asList(ints));

会发生编译错误Object[] can’t apply to int[]

jdk1.5以后,Arrays.asList变成了可变参数

public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

这样也就相当于允许了Array.asList(基本参数类型数组)
产生下面的结果

int[]ints = {12,23,34,56};System.out.println(Arrays.asList(ints));//[[I@42a57993]System.out.println(ints.toString());//[I@42a57993

产生令人遗憾的结果。这就解释为什么1.5在Arrys类中增加toString(long[]),toString(int[]),toString(short[]),toString(char[]),toString(byte[]),toString(boolean[]),toString(float[]),toString(double[]),toString(Object[]) 来提供打印数组功能。

在重视性能的情况下,使用可变参数机制要小心,因为可变参数方法的每次调用都会导致进行一次数组分配和初始化,有一种折中的解决方案,假设确定某个方法大部分调用会有3个或者更少的参数,就声明该方法的5个重载,每个重载带有0至3个普通参数,当参数数目超过3个时,使用可变参数方法。

public void foo() {}
public void foo() {int a1}
public void foo() {int a1, int a2}
public void foo() {int a1, int a2, int a3}
public void foo() {int a1, int a2, int a3, int... rest}

Effective Java之慎用可变参数(四十二)相关推荐

  1. 【零基础学Java】—throw关键字(四十六)

    [零基础学Java]-throw关键字(四十六) 一.throw关键字 public class demo {public static void main(String[] args) {//创建i ...

  2. 四十二、深入Java中的文件读取操作

    @Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. 【Java】Java反射调用可变参数的方法

    文章目录 1.概述 1.概述 因为要Java反射调用可变参数的方法,所以参考了这篇文章:https://www.cnblogs.com/huqingchen/p/5979936.html 但是测试过程 ...

  4. 【零基础学Java】—LinkedList集合(四十)

    [零基础学Java]-LinkedList集合(四十) java.util.linkedList集合implements list接口 linkedList 集合的特点: 底层是一个链表结构,查询慢, ...

  5. OpenCV学习笔记(四十一)——再看基础数据结构core OpenCV学习笔记(四十二)——Mat数据操作之普通青年、文艺青年、暴力青年 OpenCV学习笔记(四十三)——存取像素值操作汇总co

    OpenCV学习笔记(四十一)--再看基础数据结构core 记得我在OpenCV学习笔记(四)--新版本的数据结构core里面讲过新版本的数据结构了,可是我再看这部分的时候,我发现我当时实在是看得太马 ...

  6. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器 DirectInput专场

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  7. 【Microsoft Azure 的1024种玩法】四十二. 通过Windows Admin Center快速创建Azure Virtual Machines

    [简介] Windows Admin Center是微软开发的一套可以部署在本地基于浏览器的GUI的工具集平台,其平台可用于管理Windows相关服务器和PC机器,我们可以利用Windows Admi ...

  8. 【Visual C++】游戏开发笔记四十二 浅墨DirectX教程之十 游戏输入控制利器:DirectInput专场...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接:http://blog.csdn.net/zhmxy555/article/details/8547531 作者:毛星云(浅墨) ...

  9. 左耳听风 第四十二周

    左耳听风 第四十二周 每周完成一个ARTS: 每周至少做一个 leetcode 的算法题.阅读并点评至少一篇英文技术文章.学习至少一个技术技巧.分享一篇有观点和思考的技术文章.(也就是 Algorit ...

最新文章

  1. ajax 与php页面取值,在同一页面中使用PHP和AJAX的最佳方法
  2. python并发编程:阻塞IO
  3. Elastic Nodes Example 翻译及学习整理
  4. Android编译笔记一
  5. python写前端代码_python学习之路前端-JavaScript
  6. [正则表达式] 可以解析HTML/XHTML页面的所有元素和结构的Regular Expression![ZT]
  7. 所有主流浏览器都支持HTML的视频格式5,所有主流浏览器都支持HTML 5吗?
  8. python设计模式之猴子补丁模式
  9. Android如何获取Wifi名称即SSID
  10. java初学者应该怎么学?
  11. jQuery Easy UI Panel(面板)组件
  12. 如何以最好的方式实现游戏关卡
  13. codeblocks设置代码黑色主题
  14. 已解决:录屏软件录不了全屏的问题
  15. 「ZigBee模块」基础实验(2)按键
  16. gopher攻击mysql_机窝安全--安全技术 | 巧用Gopher协议扩展SSRF攻击手法
  17. 安卓自定义view仿小米商城购物车动画
  18. 嵌入式是什么 ?为什么要学好嵌入式呢?
  19. named:域名服务器部署及配置
  20. MySQL数据库高可用之mmm

热门文章

  1. setiosflags(ios::fixed)和setprecision()
  2. 关于寻路算法的一些思考(5):处理移动中的障碍物
  3. 重写数组的方法(改变原数组)
  4. 第21讲:IP代理池的搭建和使用
  5. Linux下查看系统配置
  6. 《MySQL实战45讲》实践篇 24-29 学习笔记 (主备篇)
  7. Kafka消息格式中的变长字段(Varints)
  8. Golang之变量去哪儿
  9. STL中算法锦集(三)
  10. STL中sort算法简析