Integer.toString(int i) vs String.valueOf(int i) en Java

5 minutos de lectura

Avatar de usuario de Manuel Selva
manuel selva

Me pregunto por qué el método String.valueOf(int i) existe? Estoy usando este método para convertir int en String y acabo de descubrir el Integer.toString(int i) método.

Después de ver la implementación de estos métodos, vi que el primero está llamando al segundo. Como consecuencia, todas mis llamadas a String.valueOf(int i) supone una llamada más que llamar directamente Integer.toString(int i)

  • Solo para fines de referencia: stackoverflow.com/questions/3335685/integer-tostring

    – Bobby

    26 de julio de 2010 a las 14:25

Damian Leszczyński - Avatar de usuario de Vash
Damian Leszczyński – Vash

En tipo String tenemos varios métodos valueOf

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

Como podemos ver, esos métodos son capaces de resolver todo tipo de números.

cada implementación de un método específico como el que ha presentado: Entonces, para los números enteros, tenemos

Integer.toString(int i)

para doble

Double.toString(double d)

etcétera

En mi opinión, esto no es algo histórico, pero es más útil para un desarrollador usar el método valueOf de la clase String que del tipo adecuado, ya que nos lleva a realizar menos cambios cuando queremos cambiar el tipo en el que estamos operando.

Muestra 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

Muestra2:

public String doStuff(int num) {
  
 // Do something with num...
 
 return Integer.toString(num);

 }

Como vemos en el ejemplo 2, tenemos que hacer dos cambios, al contrario del ejemplo uno.

En mi conclusión, usando el valueOf El método de la clase String es más flexible y por eso está disponible allí.

  • y no olvides Integer.toString(int i, int radix) que se convertirá en cadenas de bases distintas de 10.

    – Esteban P.

    1 oct 2010 a las 21:36

  • @Vash ¿Podría explicar también sobre el uso de una cadena vacía para convertir int en String en comparación con String.valueOf? por ejemplo) “” + int i = “i” ? Cuál es el mejor ?

    – Kanagavelu Sugumar

    24 de septiembre de 2013 a las 5:31

  • Para formatear int como cadena, no debe usar “” + i. No existe la cabeza grande pero generalmente porque esto no es elegante. En lugar de usar String.valueOf(int)puedes usar String.format("%d",i); para leer más por favor visite este sitio web docs.oracle.com/javase/6/docs/api/java/util/Formatter.html

    – Damian Leszczyński – Vash

    24 de septiembre de 2013 a las 7:38

  • Desearía que el autoboxing fuera más inteligente y simplemente agregara la conversión en la compilación o algo así.

    – Rob subvención

    14/10/2013 a las 12:38

  • @RobertGrant El autoboxing no es el caso aquí. Pero para responder a sus inquietudes, es inteligente que pueda hacer esto. int i = new Integer("1"); y viceversa.

    – Damian Leszczyński – Vash

    15/10/2013 a las 14:50


Un avatar de usuario de Costa
Costa

Una gran diferencia es que si invocas toString() en un objeto nulo obtendrás un NullPointerException mientras que, utilizando String.valueOf() usted no puede verificar nulo.

  • la pregunta es sobre Integer.toString(int i)a static método. No existen null objetos posibles.

    – Petr Janeček

    27 de junio de 2012 a las 12:40


  • Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception

    –Manish Singh

    16 de octubre de 2012 a las 6:25


  • @Manis Kumar: Su ejemplo no disparará el String.valueOf(int i) método pero String.valueOf(Object obj). De todos modos, la pregunta es sobre primitivos. int valores, donde no hay posibilidad de null.

    – hleinona

    1 de noviembre de 2012 a las 11:47

  • @manish_s quedó bastante claro en el ejemplo que nadie está hablando del tipo de objeto Integer. Sólo estamos hablando de primitivos.

    –Daniel Ochoa

    1 de marzo de 2016 a las 14:14

  • @manish_s: El OP no dijo Integer.toString() pero Integer.toString(int i). Ese es un método estático (docs.oracle.com/javase/7/docs/api/java/lang/…).

    – LarsH

    7 de diciembre de 2016 a las 3:03

Sólo dos formas diferentes de hacer lo mismo. Puede ser una razón histórica (no recuerdo si uno vino antes que el otro).

  • Sí, pero si algo está haciendo lo mismo, no significa que sean lo mismo.

    – Damian Leszczyński – Vash

    26 de julio de 2010 a las 15:29

  • String.valueOf(int) simplemente llama a Integer.toString(i) directamente. Así que es mejor llamar a Integer.toString(int).

    – djchapm

    21 de mayo de 2019 a las 16:21

Avatar de usuario de Kingo
Rey

La clase String proporciona métodos valueOf para todos los tipos primitivos y el tipo de objeto, por lo que asumo que son métodos convenientes a los que se puede acceder a través de una clase.

NB Perfilado de resultados

Promedio intToString = 5368ms, promedio stringValueOf = 5689ms (para 100,000,000 operaciones)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

Avatar de usuario de Davio
davio

De las fuentes de Java:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

Entonces dan exactamente el mismo resultado y uno de hecho llama al otro. String.valueOf es más flexible si puede cambiar el tipo más adelante.

avatar de usuario de agabrys
agabrys

Si nos fijamos en el código fuente de la String clase, en realidad llama Integer.toString() cuando usted llama valueOf().

Habiendo dicho eso, Integer.toString() podría ser un poco más rápido si las llamadas al método no están optimizadas en tiempo de compilación (que probablemente lo estén).

avatar de usuario de trashgod
dios de la basura

La implementación de String.valueOf() que ves es la forma más sencilla de cumplir con el contrato especificado en la API: “La representación es exactamente la devuelta por el Integer.toString() método de un argumento”.

¿Ha sido útil esta solución?