我正在本地社区大学学习数据结构和算法课程。该课程的教科书是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) { // ...
答案 0 :(得分:10)
您正在谈论的'...'参数称为varargs。
需要注意的一些差异:
最终参数类型后的三个句点表示 final参数可以作为数组或参数序列传递
例如,这个方法:
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不再是需要更难实现的奇怪语言。