¿Es una mejor práctica utilizar String.format sobre la concatenación de cadenas en Java?
¿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.format
te 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.format
también es más corto.
Cuál es más legible depende de cómo funciona tu cabeza.
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)
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.
Un problema .format
es 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 format
se basa la función) es largo y aterrador.
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
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.