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

What is the difference between String[] data and String... data in java

我已经尝试使用 datadata1 变量。它总是调用 String ... data。 那么,String[] dataString... data in java.

有什么区别
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);
        }
    }

}

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);
        }
    }

}

输出:

---From: String ... data---
A
B
C
---From: String[] ... data---
A
B
C
D
E

在存在两个版本的方法签名的情况下,JVM 选择最接近的匹配,这就是为什么它在 arrayTest.test(data) 的情况下进入 test(String... 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);
    }
}
method(String... s) // fine
method(int i , String... s) // fine
method(String... s,int i) // not fine , ...s should be last or only parameter
method(String[] s) // fine
method(int i , String[] s) // fine
method(String[] s,int i) // fine
method(String s[]) // fine
method(String s...) // not fine can't put dot's after variable name
method(int[] i , String[] s) //fine
method(int... i , String...) // not fine, only one var arg is allowed
method(String... s) // takes any number of comma separated string also the array of String
method(String[] s) //only takes array of String but not comma separated string

最后 -> (String[]... s) 等价于 (String[][] s)

当使用 Varargs (T...) 时,参数被打包到一个数组中,该数组在 运行 时传递给方法。 您已经用自己的实现回答了您的问题:

对于:

1) public void test(String[] ... data) -- 数据打包为 String[][]

2) public void test(String ... data) -- 数据被打包为 String[]

我强烈推荐这本书:Java generics and collections - 作者:Maurice Naftalin

String ... 将读取包含多个单词的单个句子。

String[] ... 会读一段多句。