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}