【问题标题】:What is the difference between String[] and String... in Java?Java 中的 String[] 和 String... 有什么区别?
【发布时间】:2012-08-11 23:54:43
【问题描述】:

我应该如何在 Java 中声明main() 方法?

像这样:

public static void main(String[] args)
{
    System.out.println("foo");
}

或者像这样:

public static void main(String... args)
{
    System.out.println("bar");
}

String[]String... 之间的实际区别是什么?

【问题讨论】:

    标签: java main arrays


    【解决方案1】:

    我应该如何在 Java 中声明 main() 方法?

    String[]String... 在内部是相同的,即。例如,一个字符串数组。 不同之处在于,当您使用可变参数 (String...) 时,您可以调用如下方法:

    public void myMethod( String... foo ) {
        // do something
        // foo is an array (String[]) internally
        System.out.println( foo[0] );
    }
    
    myMethod( "a", "b", "c" );
    
    // OR
    myMethod( new String[]{ "a", "b", "c" } );
    
    // OR without passing any args
    myMethod();
    

    当您将参数声明为字符串数组时,您必须这样调用:

    public void myMethod( String[] foo ) {
        // do something
        System.out.println( foo[0] );
    }
    
    // compilation error!!!
    myMethod( "a", "b", "c" );
    
    // compilation error too!!!
    myMethod();
    
    // now, just this works
    myMethod( new String[]{ "a", "b", "c" } );
    

    String[]String 之间实际上有什么区别...如果有的话?

    约定是使用String[] 作为主要方法参数,但使用String... 也可以,因为当您使用可变参数时,您可以像调用以数组作为参数的方法一样调用方法,并且参数本身将是方法体内的一个数组。

    有一点很重要,当你使用可变参数时,它必须是方法的最后一个参数,并且你只能有一个可变参数。

    您可以在此处阅读有关可变参数的更多信息:http://docs.oracle.com/javase/1.5.0/docs/guide/language/varargs.html

    【讨论】:

      【解决方案2】:

      String... 被转换为String[]。主要区别在于您可以通过 2 种方式调用 vararg 方法:

      method(a, b, c);
      method(new String[] {a, b, c});
      

      而你需要调用一个接受这样一个数组的方法:

      method(new String[] {a, b, c});
      

      对于main 方法,它没有任何区别。

      【讨论】:

        【解决方案3】:

        String[] args 接受一个数组参数。

        String... args 将任意数量的字符串作为其参数并从中创建一个数组。

        【讨论】:

          【解决方案4】:

          让我们通过示例及其超级简单来了解区别

          mymethod(String... str)
             vs
          mymethod(String []str)
          


          方法 getid 采用 int 类型数组。

          因此,如果我们调用 getId 方法,我们需要传递数组。
          要传递数组,我们可以创建匿名数组,或者只是先创建一个数组并像我在下面的示例中那样传递。

          class test
          {
              public void getid(int []i)
              {
                for(int value:i)
               {
                System.out.println(value);
               }
              }
          
              public static void main(String []arg)
              {
               int []data = {1,2,3,4,5}
               new test().getid(data);
              }
          }
          

          下面我们使用三点 -> mymethod(int... i)

          现在该方法仍然需要数组,但不同的是现在我们可以将值直接传递给该方法,并且“...”会自动将其转换为数组
          看下面的例子

          class test
          {
              public void getid(int ...i)
              {
              for(int value:i)
              {
              System.out.println(value);
              }
              }
              public static void main(String []arg)
              {
              new test().getid(1,2,3,4);
              }
          
          }
          

          使用“...”而不是“[]”的优势
          1) 节省内存:-
          在示例一中使用 mymethod(int [ ] )
          当我们在主方法“Data[]”中创建一个数组时,它们会创建新对象并在内存中获得空间
          以及当我们创建方法并在那里定义参数时:-
          getid(int []) -> 这将在内存中创建另一个对象,因此我们在内存中有 2 个彼此相同的对象

          2)使用“...”时您不能传递任何内容
          在示例 2 中,您可以在调用“getid”方法时不传递任何内容,它们将正常工作而不会出现任何错误,这对于使程序更稳定非常有帮助,例如

          .
          .
          .
              public static void main(String []arg)
              {
              new test().getid();
              }
          .
          .
          .
          


          但是如果我们调用“getid”方法并且在使用“[]”时没有传递任何参数,那么它会在编译时显示错误

          【讨论】:

            【解决方案5】:

            String[] 是一个字符串数组。因此,一个包含许多 String 数据类型变量的容器。例如:

            String[] strArray = new String[2];
            str[0] = "Hello";
            str[1] = "World";
            
            String str = "Hello World";
            

            希望这能清除您的疑问 :)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-03-26
              • 2015-06-26
              • 2016-11-09
              • 2018-06-07
              • 2012-10-06
              • 2011-01-27
              • 1970-01-01
              相关资源
              最近更新 更多