2009-02-03 25 views
339

¿Cuál es la diferencia entre estos dos métodos? Aparecen a hacer exactamente lo mismo que a mí (también vale para parseFloat(), parseDouble(), parseLong() etc, en qué se diferencian de Long.valueOf(string)Diferencia entre parseInt y valueOf en java?

Editar:?? Además, ¿cuál de estos es preferible y utiliza más a menudo por convención

Respuesta

318

Bueno, la API para Integer.valueOf(String) de hecho dice que el String se interpreta exactamente como si se hubiera dado a Integer.parseInt(String). Sin embargo, valueOf(String) devuelve un objeto newInteger() mientras que parseInt(String) devuelve una primitiva int.

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

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

Ahora bien, si lo que quiere es el objeto y no lo primitivo, a continuación, utilizando valueOf(String) puede ser más atractivo que hacer un nuevo objeto de parseInt(String) porque el primero está constantemente presente en Integer, Long, Double, etc.

+5

¿Hay alguna diferencia de rendimiento o memoria entre los dos enfoques? – Logan

+72

'Integer.valueOf (Integer.parseInt (" 123 "))' no tiene ningún beneficio sobre 'Integer.valueOf (" 123 ")' o 'Integer.valueOf (123)' aparte de perder ciclos y el tamaño de su programa. –

+7

Existe una diferencia: el nuevo objeto (potencialmente) asignado por valueOf viene con una tara (memoria para el objeto, manejo, GC), mientras que el plain int es extremadamente "liviano". (Para los valores más comunes, obtendrá referencias a Objetos preexistentes, lo que ayuda un poquito.) – foo

63

De this forum:

parseInt() rendimientos número entero primitivo tipo (int), con lo valueOf devuelve java.lang.Entero, que es el objeto representativo del número entero. Existen circunstancias en las que es posible que desee un objeto Entero, en lugar de tipo primitivo.

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

+7

Vale la pena mencionar: versiones valueOf también utilizarán una piscina de referencia interna para devolver el MISMO objeto para un valor dado, no solo otra instancia con el mismo valor interno. Esto significa que, dados dos Longs devueltos de esta manera, a.es igual a (b) == verdadero y a == b es verdadero – basszero

+0

Como se ha demostrado más abajo, Usted es correcto para las versiones de Cadena, estaba pensando en las versiones primitivas. Long.valueOf (5) siempre devolverá el mismo objeto. Las versiones de cadena devuelven objetos nuevos, las versiones primitivas devuelven los mismos objetos – basszero

+1

@bassezero. Además, ese grupo tiene un límite. Creo que fue -127 a 127. – OscarRyz

31
Integer.valueOf(s) 

es similar a

new Integer(Integer.parseInt(s)) 

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

Además, Integer.parseInt(s) también puede tomar el tipo de datos primitivo.

+4

valueOf() puede devolver el mismo objeto para llamadas sucesivas con el mismo argumento (y se requiere para argumentos entre -128 y 127 inclusive). nuevo Integer() siempre creará un nuevo objeto. –

+0

¿Cuál se usa con más frecuencia? ¿Cuál debería usar más? –

+2

Si necesita un int, use parseInt(), si necesita un entero, use valueOf() –

1

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

+0

En realidad, no del todo cierto. Lo pensé al principio, pero los Javadocs para Integer.valueOf (String) indican claramente que es equivalente a un Integer nuevo (Integer.parseInt (String)). Sin embargo, Integer.valueOf (int) sí hace caché. –

+0

Estás en lo correcto para las versiones String, estaba pensando en las versiones primitivas. Long.valueOf (5) siempre devolverá el mismo objeto. – basszero

4

Integer.parseInt solo puede devolver int como tipo nativo.

Integer.valueOf puede realmente necesitar asignar un objeto Integer, a menos que ese entero sea uno de los previamente asignados. Esto cuesta más

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

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

-2
  1. En el caso de ValueOf -> está creando un objeto Entero. 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.

Deberíamos utilizar cualquiera dependiendo de nuestras necesidades. En el caso de ValueOf como instancia de un objeto. consumirá más recursos si solo necesitamos el valor de un texto, entonces deberíamos usar parseInt, parseFloat, etc.

0

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

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

autoboxing (http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html) –

2

Porque es posible que esté utilizando jdk1.5 + y allí se convierte automáticamente a int. Por lo tanto, en su código es el primer entero que regresa y luego se convierte automáticamente a int.

su código es el mismo que

int abc = new Integer(123); 
0

Si se comprueba la clase de enteros se encuentra que el método llamado valordel parseInt. La gran diferencia es el almacenamiento en caché cuando llamas a valueof API. Se almacena en caché si el valor se encuentra entre -128 a 127 A continuación encontrará el enlace para más información

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

12

mirada a las fuentes de Java: valueOf está utilizando 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 vuelve 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); 
} 
0

public static Entero valueOf (Serie s)

  1. El argumento se interpreta como la representación de 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 Entero que representa el valor entero especificado por la cadena.

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