diferencia fn (String … args) vs fn (String args)

¿Para qué sirve esta syntax?

function(String... args) 

¿Es esto lo mismo que escribir

  function(String[] args) 

con diferencia solo mientras se invoca este método o hay alguna otra característica involucrada en él?

La única diferencia entre los dos es la forma en que llamas a la función. Con String var args puede omitir la creación de la matriz.

 public static void main(String[] args) { callMe1(new String[] {"a", "b", "c"}); callMe2("a", "b", "c"); // You can also do this // callMe2(new String[] {"a", "b", "c"}); } public static void callMe1(String[] args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } public static void callMe2(String... args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } 

La diferencia es solo cuando se invoca el método. El segundo formulario se debe invocar con una matriz, el primer formulario se puede invocar con una matriz (al igual que la segunda, sí, esto es válido según el estándar Java) o con una lista de cadenas (varias cadenas separadas por comas) o sin argumentos (el segundo siempre debe tener uno, al menos debe pasarse nulo).

Es sintácticamente azúcar. En realidad, el comstackdor gira

 function(s1, s2, s3); 

dentro

 function(new String[] { s1, s2, s3 }); 

internamente.

con varargs ( String... ) puede llamar al método de esta manera:

 function(arg1); function(arg1, arg2); function(arg1, arg2, arg3); 

No puedes hacer eso con una matriz ( String[] )

Llamas a la primera función como:

 function(arg1, arg2, arg3); 

mientras que el segundo:

 String [] args = new String[3]; args[0] = ""; args[1] = ""; args[2] = ""; function(args); 

En el tamaño del receptor obtendrá una matriz de Cadena. La diferencia solo está en el lado de la llamada.

 class StringArray1 { public static void main(String[] args) { callMe1(new String[] {"a", "b", "c"}); callMe2(1,"a", "b", "c"); callMe2(2); // You can also do this // callMe2(3, new String[] {"a", "b", "c"}); } public static void callMe1(String[] args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } public static void callMe2(int i,String... args) { System.out.println(args.getClass() == String[].class); for (String s : args) { System.out.println(s); } } }