java - number - string.format netbeans
String.format() vs operador "+" (9)
Esta pregunta ya tiene una respuesta aquí:
¿Qué se debe utilizar para una operación básica de concatenación de cadenas?
String randomString = "hello " + userName + " how are you" ?
o
String randomString = String.format("hello %s how are you ?",userName);
Siento que String.format()
da una mejor idea de la cadena de salida. Pero, ¿cuáles son realmente las ventajas y desventajas en el uso de cualquiera?
¿Hay algo en términos de rendimiento o entradas huérfanas en el conjunto literal de cadenas?
Edición : estoy hablando de múltiples parámetros en cadena, no solo uno. Alrededor de 5 +.
Pregunta de bonificación : Por favor también comparta su opinión sobre cuál debería usar realmente? Cualquiera de estos o 3er ... !! ?
¿Qué se debe utilizar para una operación básica de concatenación de cadenas?
Los ejemplos que proporciona el servidor tienen diferentes propósitos. +
está sobrecargado para concat String
s pero String.format
se usa para formatear cadenas, como lo especifica el nombre.
Concatenar cadenas no es su trabajo principal.
Por lo tanto, si el requisito es simplemente concatenar el uso +
o el método concat .
Estos enlaces serán útiles:
¿Debo usar String.format () de Java si el rendimiento es importante?
¿Es una mejor práctica utilizar String.format sobre la concatenación de cadenas en Java?
Creo que String.Format es más eficiente, porque tiene las siguientes ventajas,
- Mejor legibilidad
- Mejor traducible
- Puede usar proveedores de formato e indicadores de formato simple (como ancho fijo) directamente en la cadena de formato.
- Puedes hacer algunas cosas poderosas poniendo cadenas de formato en archivos de configuración.
- String.Format () es a menudo más rápido, ya que utiliza un StringBuilder y una máquina de estados eficiente detrás de escena, mientras que la concatenación de cadenas en .Net es relativamente lenta. Esto es especialmente cierto a medida que aumenta el tamaño de la cadena y el número de valores sustituidos.
Gracias.
En mi opinión, utilizar el + operator
.
Si el rendimiento es una preocupación, debe utilizar StringBuilder
y, como Alex señaló en su comentario anterior, el compilador de Java convertirá:
String str2 = "a" + str1;
to: String str2 = new StringBuilder("a").append(str1)).toString();
Además de esto, puede evitar las excepciones de tiempo de ejecución utilizando el + operator
. En su lugar, obtendrá errores de sintaxis que puede detectar en tiempo de compilación. Por ejemplo:
String var = "huge success.";
System.out.print( "I''m making a note here: " + var );
//System.out.print( "Printing: " + ); Syntax error!
System.out.print( String.format( "I''m making a note here: ''%s''", var ) );
System.out.print( String.format( "I''m making a note here: ''%s''" ) ); // runtime exception!
System.out.print( String.format( "I''m making a note here: ''%d''", var ) ); // runtime exception!
La legibilidad se reduce a las preferencias personales. Sin embargo, diré que la sintaxis de String.format
es básicamente de C ++ y la mayoría de los lenguajes creados desde entonces han abrazado al + operator
por razones de legibilidad.
La mayoría de las personas que recomiendan usar StringBuffer viven en el pasado. La mejor práctica actual es utilizar un StringBuilder. Pero esto podría cambiar, entonces ¿por qué no dejar que el compilador haga eso por ti? Cuando solo usas el "+", el compilador elegirá la implementación actual, que incluso puede combinar cadenas estáticas ("foo" + "barra" se convertirá en un solo "foobar").
El lugar de onle donde asignaría explícitamente un StringBuilder es en Loops (donde se crea antes del loop y se usa dentro).
Compruebe el Bytecode generado si tiene alguna duda de lo que sucede.
Entonces, ¿cuándo usar el formato? Yo usaría el formato cuando el formato real es complicado. Pero estás hablando de concatenación simple en este momento.
Mi principal preocupación con String.format
es que se trata de una operación específica de la configuración regional y puede terminar con resultados imprevistos si su código se ejecuta en una configuración regional diferente.
Me gustaría tener una alternativa no local porque su sintaxis compacta es realmente agradable.
Mis dos centavos: usar siempre String.format()
La internacionalización es una preocupación mucho más grande que el estilo o el rendimiento en esta situación. Por esa razón siempre usaría String.format()
Texto en inglés: "Hello " + userName + " how are you?"
Traducción al Jedi: nombre de userName + "you are how? Hello!"
Si las cadenas están concatenadas, cambiar el orden de las palabras puede ser difícil, si no imposible, para el traductor. Este problema se vuelve cada vez peor, ya que hay más piezas en la cadena y más marcadores de posición.
Personalmente, prefiero usar el formato porque se ve mejor y no puedo imaginar que afecte el rendimiento en gran medida.
Prueba esto
long t0 = System.currentTimeMillis();
String userName = "test";
for (int i = 0; i < 1000000; i++) {
String randomString = "hello " + userName + " how are you?";
// String randomString = String.format("hello %s how are you ?",userName);
}
System.out.println(System.currentTimeMillis() - t0);
Te sorprenderá saber que la concatinación es 10 veces más rápida que String.format. Pero el formato puede hacer muchas cosas extremadamente útiles con números, fechas, etc. Consulte la API java.util.Formatter, que en realidad utiliza String.format, para obtener más información.
Si solo buscas rendimiento, creo que usar StringBuilder/StringBuffer
es la forma más eficiente de construir cadenas. Incluso si el compilador de Java es lo suficientemente inteligente como para traducir la mayoría de las concatenaciones de String al equivalente de StringBuilder
.
Si buscas legibilidad, el String.format
es lo mucho más claro que creo, y esto es lo que uso también a menos que tenga que confiar en un alto rendimiento.
Entonces, si su principal preocupación no es el rendimiento, lo que significa que este código no se encuentra en una ruta que se llama mucho, es posible que prefiera usar String.format
ya que le da una mejor idea de la Cadena resultante (como dijo).
Además, el uso de String.format
permite usar el formato, lo que significa que puede usarlo para rellenar cadenas, números de formato, fechas, etc., lo que empeoraría el código si se utiliza una concatenación simple.
Editar para Chuu :
Usando JAD , puedes ver que el siguiente código:
public class Test {
public static void main(String[] args) {
String str = "a" + "b" + "c";
String str2 = "foo" + str + "bar" + str;
System.out.println(str2);
}
}
cuando se descompile se verá como
public class Test {
public static void main(String[] args) {
String str = "abc";
String str2 = new StringBuilder("foo").append(str).append("bar").append(str).toString();
System.out.println(str2);
}
}
Una prueba de eso también se puede encontrar utilizando la utilidad javap
que le mostrará el código de bytes de Java en un archivo .class
:
public static void main(java.lang.String[] args);
0 ldc <String "abc"> [16]
2 astore_1 [str]
3 new java.lang.StringBuilder [18]
6 dup
7 ldc <String "foo"> [20]
9 invokespecial java.lang.StringBuilder(java.lang.String) [22]
12 aload_1 [str]
13 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
16 ldc <String "bar"> [29]
18 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
21 aload_1 [str]
22 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [25]
25 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [31]
28 astore_2 [str2]
29 getstatic java.lang.System.out : java.io.PrintStream [35]
32 aload_2 [str2]
33 invokevirtual java.io.PrintStream.println(java.lang.String) : void [41]
36 return