java中String[]数据和String...数据有什么区别

Mad*_*tha 5 java variadic-functions

我曾尝试使用datadata1变量。它总是调用String ... data。那么,java中的String[]数据String...数据有什么区别呢

public class ArrayTest {

    public static void main(String[] args) {

        ArrayTest arrayTest = new ArrayTest();
        // Option one
        String[] data = {"A", "B", "C"};
        // Option two
        String data1 = "A";
        arrayTest.test(data);


    }

    public void test(String[] ... data  ) {
        System.out.println("---From: String[] ... data---");

        for(String[] item: data) {

            for(String innerItem : item) {
                System.out.println(innerItem);
            }

        }
    }

    public void test(String ... data  ) {
        System.out.println("---From: String ... data---");
        for(String item: data) {
            System.out.println(item);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Arv*_*ash 2

您正在test(String... data)传递一个字符串数组,并且test(String[]... data)您正在传递一个字符串数组的数组。检查更新后的代码以进行说明:

public class ArrayTest {

    public static void main(String[] args) {

        ArrayTest arrayTest = new ArrayTest();
        // Option one
        String[] data = { "A", "B", "C" };
        // Option two
        arrayTest.test(data);

        String[] data2 = { "D", "E" };
        arrayTest.test(data, data2);
    }

    public void test(String[]... data) {
        System.out.println("---From: String[] ... data---");

        for (String[] item : data) {

            for (String innerItem : item) {
                System.out.println(innerItem);
            }

        }
    }

    public void test(String... data) {
        System.out.println("---From: String ... data---");
        for (String item : data) {
            System.out.println(item);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

输出:

---From: String ... data---
A
B
C
---From: String[] ... data---
A
B
C
D
E
Run Code Online (Sandbox Code Playgroud)

在存在两个版本的方法签名的情况下,JVM 会选择最接近的版本,这就是为什么它会test(String... data)在 的情况下转到,而在 的情况下arrayTest.test(data)会转到。test(String[]... data)arrayTest.test(data, data2)

如果删除以下定义,该程序仍然可以运行,但 JVM 将只剩下一个选择,即test(String[]... data)两个调用都进行。

public void test(String... data) {
    System.out.println("---From: String ... data---");
    for (String item : data) {
        System.out.println(item);
    }
}
Run Code Online (Sandbox Code Playgroud)