Java可变长度参数与数组,简单的句法糖?

时间:2015-08-30 19:02:23

标签: java arrays

我正在本地社区大学学习数据结构和算法课程。该课程的教科书是Y. Daniel Liang的 Java编程简介,第10版。这本书本身非常可靠。

在处理Java.util.Arrays时,Liang提到了Java的“可变长度”参数。他写道(第265页):

  

Java将可变长度参数视为数组。你可以通过   数组或可变长度的可变数量的参数   参数。调用具有可变数量参数的方法时,   Java创建一个数组并将参数传递给它。

一个例子是:

public static void (int... toes) {
    //... some code
}

然而,梁从未解释变长参数的起源或优势。如果像梁说的那样,将可变长度参数“转换”为数组,那么它们的优势是什么?是否有可变长度参数促进的软件设计模式或工程目标?

换句话说,上面的代码片段提供的内容不是由以下内容提供的:

public static void (int[] toes) { // ...

2 个答案:

答案 0 :(得分:10)

您正在谈论的'...'参数称为varargs

需要注意的一些差异:

  • varargs可以传递没有参数(基本上被忽略),null或不确定数量的参数,而数组参数必须传递给数组或null
  • varargs 必须是您方法的最后一个参数,而对数组参数无关紧要。这是因为varargs的这种特殊属性,这可能是你发布的两件事之间最重要的区别:
  

最终参数类型后的三个句点表示   final参数可以作为数组或参数序列传递

Source

例如,这个方法:

public void myMethod(String... args) {}

可以使用以下任一方法调用:

String[] myStrings = {"a", "b", "c"};
myMethod(myStrings);
myMethod("a", "b", "c");

有关何时应使用varargs的详细说明,请参阅this

答案 1 :(得分:3)

在Java中,varargs是在调用方法时创建数组的语法糖。例如,这两个调用是等效的:

void foo(String... args) { ... }

foo("hello", null, "world", xyz);  // Java 1.5+
foo(new String[]{"hello", null, "world", xyz});  // All versions of Java

Varargs没有任何新的可能(通过语法糖的定义),但它减少了冗长,并使一些结构更加适合实现。例如,我最喜欢使用的一些vararg包括:PrintStream.printf()String.format()Method.invoke()

varargs的其他好的应用:

// This one is in the Java standard library
Collections: void addAll(Collection<? super T> c, T... elements);

// Custom examples
int max(int... nums);
void doOperation(File x, String y, SomeEnum options...);

此外,Java的varargs使语言与C,Python,JavaScript和其他语言的vararg支持相提并论。因此,如果频繁重复的设计(例如max())最适合varargs,那么Java不再是需要更难实现的奇怪语言。