【问题标题】:What is the difference between String[] data and String... data in java [duplicate]java中的String []数据和String ...数据有什么区别[重复]
【发布时间】:2020-03-07 15:34:03
【问题描述】:

我尝试过使用 datadata1 变量。它总是调用 String ... data。 那么,String[] dataString... data在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);
        }
    }

}

【问题讨论】:

  • String[] ...String[] 不同
  • @SamiKuhmonen 那么我的问题是,为什么同时允许两种测试方法?以及为什么总是调用String ...方法?
  • 您对String[]... data 的问题是在您的代码中还是对String[] data 的问题是在您的标题中?

标签: java variadic-functions


【解决方案1】:

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) 而在 arrayTest.test(data, data2) 的情况下转到 test(String[]... data)

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

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

【讨论】:

    【解决方案2】:

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

    为:

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

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

    我强烈推荐这本书:Java 泛型和集合——作者 Maurice Naftalin

    【讨论】:

      【解决方案3】:
      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)

      【讨论】:

        【解决方案4】:

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

        String[] ... 将读取多个句子的段落。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-11
          • 2016-05-17
          • 1970-01-01
          • 1970-01-01
          • 2023-01-22
          • 2016-03-26
          • 2016-07-02
          • 2022-01-13
          相关资源
          最近更新 更多