programs program and java language-features

program - ¿Diferencia entre parseInt y valueOf en java?



java c++ (11)

¿Cuál es la diferencia entre estos dos métodos? Parece que me hacen exactamente lo mismo (también se parseFloat() a parseFloat() , parseDouble() , parseLong() etc., ¿en qué se diferencian de Long.valueOf(string) ?

Edición: también, ¿cuál de estos es preferible y se usa más a menudo por convención?


  1. En el caso de ValueOf -> está creando un objeto Integer. No es un tipo primitivo y no es un método estático.
  2. En el caso de ParseInt.ParseFloat -> devuelve el tipo primitivo respectivo. y es un método estático.

Debemos usar cualquiera dependiendo de nuestra necesidad. En el caso de ValueOf ya que está instanciando un objeto. consumirá más recursos si solo necesitamos el valor de un texto, entonces deberíamos usar parseInt, parseFloat etc.


Bueno, la API para Integer.valueOf(String) sí dice que String se interpreta exactamente como si se le hubiera dado a Integer.parseInt(String) . Sin embargo, valueOf(String) devuelve un new objeto Integer() mientras que parseInt(String) devuelve un int primitivo.

Si desea disfrutar de los beneficios potenciales de almacenamiento en caché de Integer.valueOf(int) , también puede usar esta monstruosidad:

Integer k = Integer.valueOf(Integer.parseInt("123"))

Ahora, si lo que desea es el objeto y no el primitivo, entonces usar valueOf(String) puede ser más atractivo que hacer un nuevo objeto fuera de parseInt(String) porque el primero está constantemente presente en Integer , Long , Double , etc.


Dado que valueOf devuelve un nuevo objeto Integer, ¿por qué el código siguiente es correcto?

String base5String = "230"; int result = Integer.valueOf(base5String);


De este foro :

parseInt() devuelve el tipo entero primitivo ( int ), por lo que valueOf devuelve java.lang.Integer , que es el objeto representativo del entero. Hay circunstancias en las que es posible que desee un objeto Integer, en lugar de un tipo primitivo.

Por supuesto, otra diferencia obvia es que intValue es un método de instancia por el cual parseInt es un método estático.


Debido a que puede estar usando jdk1.5 + y allí se convierte automáticamente a int. Por lo tanto, en su código su primer entero devuelto y luego se convierte automáticamente a int.

tu código es igual que

int abc = new Integer(123);


Integer.parseInt puede devolver int como tipo nativo.

Es posible que Integer.valueOf tenga que asignar un objeto Integer, a menos que ese entero sea uno de los preasignados. Esto cuesta más.

Si solo necesita un tipo nativo, use parseInt. Si necesitas un objeto, usa valueOf.

Además, debido a esta asignación potencial, el autoboxing no es realmente bueno en todos los sentidos. Puede ralentizar las cosas.


Las variaciones de análisis * devuelven tipos primitivos y las versiones valueOf devuelven Objetos. Creo que las versiones valueOf también usarán un grupo de referencia interno para devolver el MISMO objeto para un valor dado, no solo otra instancia con el mismo valor interno.


Mire las fuentes de Java: valueOf está usando parseInt :

/** * Parses the specified string as a signed decimal integer value. * * @param string * the string representation of an integer value. * @return an {@code Integer} instance containing the integer value * represented by {@code string}. * @throws NumberFormatException * if {@code string} cannot be parsed as an integer value. * @see #parseInt(String) */ public static Integer valueOf(String string) throws NumberFormatException { return valueOf(parseInt(string)); }

parseInt devuelve int

/** * Parses the specified string as a signed decimal integer value. The ASCII * character /u002d (''-'') is recognized as the minus sign. * * @param string * the string representation of an integer value. * @return the primitive integer value represented by {@code string}. * @throws NumberFormatException * if {@code string} cannot be parsed as an integer value. */ public static int parseInt(String string) throws NumberFormatException { return parseInt(string, 10); }


Si verifica la clase Integer, encontrará ese valor del método parseInt de llamada. La gran diferencia es el almacenamiento en caché cuando se llama valueof API. Se almacena en caché si el valor está entre -128 y 127. A continuación, encontrará el enlace para obtener más información.

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html


entero estático público valueOf (String s)

  1. El argumento se interpreta como que representa un entero decimal con signo, exactamente como si el argumento se hubiera dado al método parseInt (java.lang.String).
  2. El resultado es un objeto Integer que representa el valor entero especificado por la cadena.

  3. En otras palabras, este método devuelve un objeto Integer igual al valor de: new Integer (Integer.parseInt (s))


Integer.valueOf(s)

es parecido a

new Integer(Integer.parseInt(s))

La diferencia es que valueOf() devuelve un Integer y parseInt() devuelve un int (un tipo primitivo). También tenga en cuenta que valueOf() puede devolver una instancia de Integer caché, lo que puede causar resultados confusos en los que el resultado de == pruebas parezca intermitentemente correcto. Antes del autoboxing podría haber una diferencia en la conveniencia, después de Java 1.5 no importa.

Además, Integer.parseInt(s) puede tomar tipos de datos primitivos.