2010-10-14 24 views
388

A veces java me desconcierta.
Tengo una gran cantidad de int inicializaciones para hacer.Java int a String - Integer.toString (i) vs new Entero (i) .toString()

¿Cuál es el real diferencia?

  1. Integer.toString(i)
  2. new Integer(i).toString()
+20

me acaba de usar ' "" + 42', pero bueno, ese soy yo. La Forma # 2 dará como resultado un nuevo objeto entero (para la mayoría de los valores de i) como un intermedio. También es más tipeo. –

+14

@pst: si el objeto intermedio es un problema para ti, entonces '" "+ 42' no es mejor, ya que requiere un' StringBuilder' intermedio que es mucho más pesado que un 'Entero '. –

+45

"" + 42 podría funcionar, pero es una mala idea. Gente como yo irá a ver tu código e intentará descubrir qué diablos pasó con la cadena vacía. – Mainguy

Respuesta

518

Integer.toString llama al método estático en la clase Integer. No necesita una instancia de Integer.

Si llama al new Integer(i), crea una instancia del tipo Integer, que es un objeto completo de Java que encapsula el valor de su int. A continuación, llama al método toString para solicitarle que devuelva una representación de cadena en sí.

Si todo lo que desea es imprimir un int, usaría el primero porque es más ligero, más rápido y no usa memoria extra (aparte de la cadena devuelta).

Si quiere un objeto que represente un valor entero -para ponerlo dentro de una colección, por ejemplo- usaría el segundo, ya que le da un objeto completo para hacer todo tipo de cosas que no puede hacer con un desnudo int.

93

new Integer(i).toString() primero crea un objeto envoltorio (redundante) alrededor de i (que a su vez puede ser un objeto contenedor Integer).

Integer.toString(i) es preferible porque no crea ningún objeto innecesario.

14
  1. new Integer(i).toString();

    Esta sentencia crea el objeto de la Entero y luego llamar a sus métodos toString(i)devolver la representación de cadena del valor del entero.

  2. Integer.toString(i);

    Se devuelve el objeto de cadena que representa el int específico (número entero), pero aquí toString(int) es un método static.

Resumen es en el primer caso devuelve la representación de cadena de objetos, donde, como en el segundo caso, devuelve la representación de cadena de entero.

+3

¿Cuál es mejor en términos de rendimiento? – marcolopes

4

En términos de medición del rendimiento, si está considerando el rendimiento en el tiempo, entonces el Integer.toString (i); es costoso si llama menos de 100 millones de veces. De lo contrario, si son más de 100 millones de llamadas, el nuevo Entero (10) .toString() tendrá un mejor rendimiento.

A continuación se muestra el código a través de u puede tratar de medir el rendimiento,

public static void main(String args[]) { 
      int MAX_ITERATION = 10000000; 
     long starttime = System.currentTimeMillis(); 
     for (int i = 0; i < MAX_ITERATION; ++i) { 
      String s = Integer.toString(10); 
     } 
     long endtime = System.currentTimeMillis(); 
     System.out.println("diff1: " + (endtime-starttime)); 

     starttime = System.currentTimeMillis(); 
     for (int i = 0; i < MAX_ITERATION; ++i) { 
      String s1 = new Integer(10).toString(); 
     } 
     endtime = System.currentTimeMillis(); 
     System.out.println("diff2: " + (endtime-starttime)); 
    } 

En términos de memoria, la

new Integer (i) .toString();

tomará más memoria, ya que creará el objeto cada vez, por lo que la fragmentación de la memoria se producirá.

+2

Pegué este código en IntelliJ IDEA y recibí una advertencia: "' nuevo Integer (10) .toString() se puede simplificar a Integer.toString (10) '" – oksayt

+0

Este código funciona para mí. Obtengo unos 420 milisegundos para Integer.toString (10) y 525 milisegundos para el nuevo Integer (10) .toString() –

+13

Este es un punto de referencia arbitrario ... –

13

también recomiendo encarecidamente utilizar

int integer = 42; 
String string = integer + ""; 

simple y eficaz.

+37

esto es definitivamente una mala forma, porque ambos se basan en una parte bastante sutil del lenguaje Java y es menos eficiente que Integer.toString (i). Ver [esta publicación SO] (http://stackoverflow.com/questions/4105331/how-to-convert-from-int-to-string) – rickcnagy

+0

Esto podría ser ineficiente. Sugiero usar algunas elecciones convencionales como Integer.toString o String.valueOf. Consulte aquí http://javadevnotes.com/java-integer-to-string-examples – JavaDev

+0

En general, es una mala idea hacer cosas de una manera tan poco intuitiva. Las opciones más obvias como 'Integer.toString()' podrían usar algunas teclas extra, pero son mucho más claras, lo cual es crucial cuando se quiere mantener el código. –

2

Mejor:

Integer.valueOf(i).toString() 
+9

¿Por qué es esto mejor? – Emile

+1

Creo que esto es mejor, porque como @Dhiraj señaló que en términos de memoria, el "nuevo entero (i) .toString();" tomará más memoria porque crea un objeto nuevo en lugar de solo obtener el valor de Entero y convertirlo en una cadena. – Patricia

+4

@Lucy Integer.valueOf (i) devuelve un nuevo entero, por lo que no hay diferencia – inigoD

32

Otra opción es la String.valueOf método estático.

String.valueOf(i) 

Se siente poco más derecho que Integer.toString(i) a mí. Cuando el tipo de yo cambie, por ejemplo de int a double, el código permanecerá correcto.

+2

Sí. A menos que deba usar RADIX (en ese caso debe usar Integer.toString) – marcolopes

1

Aquí Integer.toString llama al método estático en la clase Entero. No requiere que el objeto llame.

Si llama al new Integer(i) primero crea una instancia de tipo Entero, que es un objeto completo de Java que encapsula el valor de su int i. A continuación, llama al método toString para solicitarle que devuelva una representación de cadena de sí mismo.

9

Aunque me gusta la recomendación de fhucho de

String.valueOf(i) 

La ironía es que este método realmente llama

Integer.toString(i) 

tanto, el uso String.valueOf(i) si te gusta la forma en que lee y que no es necesario radix, pero también sabiendo que es menos eficiente que Integer.toString(i).

2

forma sencilla es simplemente concatenar con "" entero:

Int i = 100; 

String s = ""+ i; 

ahora s tendrá "100" como valor de cadena.

0

1. Integer.toString(i)

Integer i = new Integer(8); 
    // returns a string representation of the specified integer with radix 8 
String retval = i.toString(516, 8); 
System.out.println("Value = " + retval); 

2. new Integer(i).toString()

int i = 506; 

String str = new Integer(i).toString(); 
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String