Java int to String - Integer.toString (i) vs new Integer (i) .toString ()

428

A veces Java me desconcierta.
Tengo una gran cantidad de inicializaciones int para hacer.

¿Cuál es la verdadera diferencia?

  1. Integer.toString(i)
  2. new Integer(i).toString()
marcolopes
fuente
20
Solo lo usaría "" + 42, pero bueno, ese soy yo. El formulario # 2 dará como resultado un nuevo objeto entero (para la mayoría de los valores de i) como intermedio. También es más mecanografía.
16
@pst: si el objeto intermedio es un problema para usted, entonces "" + 42no es mejor, ya que requiere un intermedio StringBuilderque es mucho más pesado que un Integer.
Joachim Sauer
47
"" + 42 podría funcionar, pero es una mala idea. Gente como yo vendrá a ver tu código e intentará descubrir qué diablos le pasó a la cadena vacía.
Mainguy
3
No lo recomendaría "" + 42porque en el caso de agregar cadenas de enteros, puede terminar agregando los valores y sin darse cuenta.
BoltzmannBrain
20
Si no te gusta escribir mucho, entonces probablemente no deberías programar en Java.
Adam Pierce

Respuestas:

548

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

Si llama new Integer(i), crea una instancia de tipo Integer, que es un objeto Java completo que encapsula el valor de su int. Luego, llama al toStringmétodo para pedirle que devuelva una representación de cadena de sí mismo .

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 adicional (aparte de la cadena devuelta).

Si desea 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 simple objeto int.

Vaquero
fuente
96

new Integer(i).toString()primero crea un objeto envoltorio (redundante) alrededor i(que en sí mismo puede ser un objeto envoltorio Integer).

Integer.toString(i) se prefiere porque no crea objetos innecesarios.

oksayt
fuente
43

Otra opción es el String.valueOfmétodo estático .

String.valueOf(i)

Se siente un poco más correcto que Integer.toString(i)para mí. Cuando el tipo de i cambia, por ejemplo de inta double, el código seguirá siendo correcto.

fhucho
fuente
2
Si. A menos que deba usar RADIX (en ese caso, debe usar Integer.toString)
marcolopes
14
  1. new Integer(i).toString();

    Esta declaración crea el objeto del entero y luego llama a sus métodos toString(i)para 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 staticmétodo.

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.

Dhiraj
fuente
13

También recomiendo usar

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

Simple y efectivo.

Jasper Holton
fuente
38
esta es definitivamente una mala forma, porque se basa en una parte bastante sutil del lenguaje Java y es menos eficiente que Integer.toString (i). Ver esta publicación SO
rickcnagy
Esto podría ser ineficiente. Sugiero usar algunas opciones convencionales como Integer.toString o String.valueOf. Consulte aquí javadevnotes.com/java-integer-to-string-examples
JavaDev
En general, es una mala idea hacer las cosas de una manera tan poco intuitiva. Las opciones más obvias como Integer.toString()podrían usar algunas teclas adicionales, pero son mucho más claras, lo cual es crucial cuando desea mantener el código.
Calvin Li
¿No llamaría esto automáticamente al toString()método de la variable entera ?
Ankit Deshpande
11

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)

Por lo tanto, úselo String.valueOf(i)si le gusta cómo se lee y no necesita radix, pero también sabiendo que es menos eficiente que Integer.toString(i).

Nathan Waite
fuente
4

En términos de medición del rendimiento, si está considerando el rendimiento del tiempo, 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 Integer (10) .toString () funcionará mejor.

A continuación se muestra el código a través del cual puede intentar 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, el

nuevo entero (i) .toString ();

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

Dhiraj
fuente
2
Pegué este código en IntelliJ IDEA y recibí una advertencia: " new Integer(10).toString() can be simplified to Integer.toString(10)"
oksayt
Este código me funciona. Tengo alrededor de 420 milisegundos para Integer.toString (10) y 525 milisegundos para el nuevo Integer (10) .toString ()
Jake Stevens-Haas
Habría ayudado a calentar primero, de lo contrario los resultados no son válidos.
sixones
Si dice que uno es caro en un caso, y el otro es mejor en el otro caso, eso significa que el otro es mejor / económico en todas las situaciones.
Sgene9
2

Mejor:

Integer.valueOf(i).toString()
ryu
fuente
99
¿Por qué es esto mejor?
Emile el
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 nuevo objeto en lugar de obtener el valor entero y convertirlo en una cadena.
Patricia
44
@Lucy Integer.valueOf (i) devuelve un nuevo número entero, por lo que no hay diferencia
inigoD
No estás proporcionando una respuesta a la pregunta en absoluto. La pregunta es cuál es la diferencia entre bla y bla, no cuál es un mejor reemplazo para bla.
ahitt6345
2

La forma simple es simplemente concatenar ""con un entero:

int i = 100;

String s = "" + i;

ahora stendrá 100como valor de cadena.

Shiv Buyya
fuente
1

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

Si llama new Integer(i)primero, cree una instancia de tipo Integer, que es un objeto Java completo que encapsula el valor de su int i. Luego, llama al toStringmétodo para pedirle que devuelva una representación de cadena de sí mismo.

Shailej Shimpi
fuente
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
Shiva Nandam Sirmarigari
fuente