变量长度参数是否被视为Java中的数组?

16 java arrays variadic-functions

据我所知,array由一定数量的元素组成,并且variable length argument你传递的参数数量相同(相同类型).但他们一样吗?我可以通过另一个预期的地方吗?

Jon*_*eet 24

是的,如果你有一个带有varargs参数的方法,如下所示:

public void foo(String... names)
Run Code Online (Sandbox Code Playgroud)

你这样称呼它:

foo("x", "y", "z");
Run Code Online (Sandbox Code Playgroud)

然后编译器将其转换为:

foo(new String[] { "x", "y", "z"});
Run Code Online (Sandbox Code Playgroud)

names参数的类型是String[],并且可以像任何其他数组变量一样使用.请注意,它可能仍然是null:

String[] nullNames = null;
foo(nullNames);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅varargs文档.

但这并不意味着可变参数与阵列互换-你仍然需要声明接受可变参数的方法.例如,如果您的方法声明为:

public void foo(String[] names)
Run Code Online (Sandbox Code Playgroud)

那么调用它的第一种方法就不会编译.


Pet*_*sik 8

它们是相同的,JVM在创建varargs方法时内部使用该数组.所以你可以像处理数组一样对待vararg参数,所以使用例如增强的for循环

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}
Run Code Online (Sandbox Code Playgroud)

并像这样调用它甚至传递一个数组

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});
Run Code Online (Sandbox Code Playgroud)

有关详细说明,请参阅此文章.


Sam*_*G-H 5

一个简单的测试表明它们是相同的:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

string1
string2
string3
string4
string5
string6
Run Code Online (Sandbox Code Playgroud)