¿Es una mejor práctica utilizar String.format sobre la concatenación de cadenas en Java?

Resuelto Omar Kooheji asked hace 15 años • 16 respuestas

¿Existe una diferencia perceptible entre utilizarString.format y la concatenación de cadenas en Java?

tiendo a usarString.format pero ocasionalmente me equivoco y uso una concatenación. Me preguntaba si uno era mejor que el otro.

A mi modo de ver, String.formatte da más poder para "formatear" la cadena; y la concatenación significa que no tienes que preocuparte por poner accidentalmente un %s adicional o perder uno.

String.formattambién es más corto.

Cuál es más legible depende de cómo funciona tu cabeza.

Omar Kooheji avatar May 29 '09 17:05 Omar Kooheji
Aceptado

Sugeriría que es una mejor práctica utilizar String.format(). La razón principal es que String.format()se puede localizar más fácilmente con texto cargado desde archivos de recursos, mientras que la concatenación no se puede localizar sin producir un nuevo ejecutable con código diferente para cada idioma.

Si planeas que tu aplicación sea localizable, también debes acostumbrarte a especificar posiciones de argumentos para tus tokens de formato:

"Hello %1$s the time is %2$t"

Luego, esto se puede localizar e intercambiar los tokens de nombre y hora sin necesidad de volver a compilar el ejecutable para tener en cuenta los diferentes pedidos. Con las posiciones de los argumentos también puedes reutilizar el mismo argumento sin pasarlo a la función dos veces:

String.format("Hello %1$s, your name is %1$s and the time is %2$t", name, time)
workmad3 avatar May 29 '2009 10:05 workmad3

Sobre el rendimiento:

public static void main(String[] args) throws Exception {      
  long start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = "Hi " + i + "; Hi to you " + i*2;
  }
  long end = System.currentTimeMillis();
  System.out.println("Concatenation = " + ((end - start)) + " millisecond") ;

  start = System.currentTimeMillis();
  for(int i = 0; i < 1000000; i++){
    String s = String.format("Hi %s; Hi to you %s",i, + i*2);
  }
  end = System.currentTimeMillis();
  System.out.println("Format = " + ((end - start)) + " millisecond");
}

Los resultados del tiempo son los siguientes:

  • Concatenación = 265 milisegundos
  • Formato = 4141 milisegundos

Por lo tanto, la concatenación es mucho más rápida que String.format.

Icaro avatar Jan 18 '2010 16:01 Icaro

Un problema .formates que se pierde la seguridad de tipo estático. Puede tener muy pocos argumentos para su formato y puede tener tipos incorrectos para los especificadores de formato; ambos conducen a un IllegalFormatException at runtime , por lo que podría terminar con un código de registro que interrumpa la producción.

Por el contrario, +el compilador puede probar los argumentos.

La historia de seguridad deimprimirf(en el que formatse basa la función) es largo y aterrador.

Martin Schröder avatar Feb 23 '2012 14:02 Martin Schröder

Dado que hay una discusión sobre el rendimiento, pensé en agregar una comparación que incluyera StringBuilder. De hecho, es más rápido que el concat y, naturalmente, la opción String.format.

Para hacer de esto una especie de comparación de manzanas con manzanas, creo una instancia de un nuevo StringBuilder en el bucle en lugar de fuera (esto en realidad es más rápido que hacer solo una instanciación, probablemente debido a la sobrecarga de reasignar espacio para el anexo del bucle al final de un constructor).

    String formatString = "Hi %s; Hi to you %s";

    long start = System.currentTimeMillis();
    for (int i = 0; i < 1000000; i++) {
        String s = String.format(formatString, i, +i * 2);
    }

    long end = System.currentTimeMillis();
    log.info("Format = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        String s = "Hi " + i + "; Hi to you " + i * 2;
    }

    end = System.currentTimeMillis();

    log.info("Concatenation = " + ((end - start)) + " millisecond");

    start = System.currentTimeMillis();

    for (int i = 0; i < 1000000; i++) {
        StringBuilder bldString = new StringBuilder("Hi ");
        bldString.append(i).append("; Hi to you ").append(i * 2);
    }

    end = System.currentTimeMillis();

    log.info("String Builder = " + ((end - start)) + " millisecond");
  • 2012-01-11 16:30:46,058 INFORMACIÓN [TestMain] - Formato = 1416 milisegundos
  • 2012-01-11 16:30:46,190 INFORMACIÓN [TestMain] - Concatenación = 134 milisegundos
  • 2012-01-11 16:30:46,313 INFORMACIÓN [TestMain] - Generador de cadenas = 117 milisegundos
TechTrip avatar Jan 11 '2012 22:01 TechTrip

Cuál es más legible depende de cómo funciona tu cabeza.

Tienes tu respuesta ahí mismo.

Es una cuestión de gusto personal.

Supongo que la concatenación de cadenas es ligeramente más rápida, pero eso debería ser insignificante.

Thilo avatar May 29 '2009 10:05 Thilo