2012-05-16 21 views
46

Encontré una clase que usa variables enteras para capturar el tamaño que se utilizará en un ciclo for. ¿Es esta una buena práctica o deberíamos usar el tipo de datos prim prim?Usando int vs Integer

Integer size = something.getFields().size(); 
for (Integer j = 0; j < size - 1; ++j) 
+4

Posible duplicado: ** [int o Entero] (http: // stackoverflow.com/a/423718/500725) ** –

+0

se proporciona la clase Integer para que los valores se puedan empaquetar/desempaquetar de manera puramente OO. use int cuando sea apropiado a menos que necesite específicamente usarlo de una manera OO; en cuyo caso, entero es apropiado. –

+0

posible duplicado de [int o Integer] (http://stackoverflow.com/questions/423704/int-or-integer) –

Respuesta

65

se proporciona la clase de enteros para que los valores pueden ser encajonados/sin embalaje de una manera OO puro. use int cuando sea apropiado a menos que necesite específicamente usarlo de una manera OO; en cuyo caso, entero es apropiado.

Java Int vs Integer

Sin embargo, muy diferentes las cosas van de debajo de las sábanas aquí. Un int es un número; an> Integer es un puntero que puede hacer referencia a un objeto que contiene un número.

...

Un int no es un objeto y no se puede pasar a ningún método que requiera objetos . Un caso común es el uso de las clases de recopilación proporcionadas ( Lista, Mapa, Conjunto), aunque es posible escribir versiones de estas clases que proporcionan capacidades similares a las versiones de objeto. Las clases de contenedor (entero, doble, etc.) se requieren con frecuencia cuando se usa la introspección (como en la API de reflexión).

una mejor descripción de cuándo utilizar uno contra el otro:

La elección entre int Entero y

Voy a empezar con cómo estos tipos se deben utilizar antes de entrar en detalle sobre por qué.

  • Prefiero int por razones de rendimiento
  • métodos que toman los objetos (incluyendo los tipos genéricos como List<T>) requerirá implícitamente el uso de enteros
  • El uso de Integer es relativamente barato para valores bajos (-128 a 127) debido a internar - Integer.valueOf(int) usar y no es nuevo entero (int)
  • no utilice == o != con tipos enteros
  • considerar el uso de Integer cuando se necesita para representar el ausencia de un valor (null)
  • Cuidado con valores enteros unboxing a int con valores nulos
+2

Tu respuesta es muy buena. Tenga en cuenta el beneficio de rendimiento en aplicaciones móviles/recursos restringidos de usar valores primitivos. –

+0

"Un int no es un objeto y no se puede pasar a ningún método que requiera objetos". ¿Qué tal doSomething (911)? objeto público doSomething (Objeto o) { // ¡¡¡haga algo !!! return o; } –

34

Si puede utilizar int lo hacen. Si el valor puede ser null o se usa como un objeto, p. Ej. Genéricos, use Integer

Por lo general, no importa cuál use pero a menudo int tiene un desempeño ligeramente mejor.

+0

También es trivial cambiar de un lado a otro usando 'Integer # intValue (Entero)' y 'Entero # valueOf (int) ' – ametren

+0

Creo que quiere decir' Integer.intValue() ';) Con el auto-boxing y el unboxing introducido en Java 5.0, no necesita hacer esto. –

+5

En muchos casos 'int' no solo funciona * levemente *, sino que es mucho mejor, especialmente en bucles estrechos :) – dasblinkenlight

1

Promueva los tipos primitivos siempre que sea posible.

tipos primitivos no se pueden utilizar como GenericArgument o null.

14

Este enfoque no es bueno en la práctica, use int siempre que sea posible. El uso de Integer indica que esta variable en particular puede ser null (o que estaba dentro de una colección, malditos genéricos ...) - que no es el caso.

También usando Integer introduce una sobrecarga adicional de boxeo y desembalaje.

3

Este es un desastre potencial que está por ocurrir en grandes proyectos. El codificador aquí olvidó que cada entero es en realidad un objeto nuevo y, para usarlo como int, tiene que haber boxeo y unboxing todo el tiempo. No solo es ineficiente, sino que tampoco se ejecutará como se espera. Se recomienda utilizar siempre int siempre que sea posible, y solo utilizar entero para colocar estos valores en listas, contenedores o para el almacenamiento de la base de datos. Recuerde, comparar objetos usando>, < y == significa algo más que cuando está usando los mismos operadores para comparar primitivas.

1

No lo utilice solo para dar vueltas. Utilice el tipo primitivo int (mejor rendimiento), que no es lo mismo que el entero de clase.

La clase de enteros se ajusta un valor de la int tipo primitivo en un objeto . Un objeto de tipo entero contiene un campo único cuyo tipo es int.

Además, esta clase proporciona varios métodos para convertir un int en una cadena y una cadena en un int, así como otras constantes y métodos útiles cuando se trata de un int.

Por lo tanto, utilice Entero si necesita llamar a las funciones Entero o si necesita asignarle un valor nulo.

También tendrá que utilizar enteros en lugar de int para los genéricos como Lista

1

Cuando existe la necesidad de la utilización de objetos, tener que utilizar las clases de envoltura, como Integer, Double, Float, etc ...

por ejemplo:

int n = Integer.parseInt("10"); 

Aquí estamos convirtiendo la cadena en un entero (tipo Primitivo), pero el método parseInt (String str) funciona solo en las clases de Contenedor (es decir, Objeto), así que lo usamos ... lo encontrará mucho más uso en java

1

Puede haber una penalización de rendimiento debido al boxeo y al desempaquetado, ya que se incurre en la sobrecarga de conversión entre un tipo primitivo y uno de referencia.

Sin embargo, la clase Entero agrega métodos adicionales que pueden ser muy útiles.

0

Normalmente uso enteros por puramente OO. El rendimiento de int es definitivamente mucho mejor que su homólogo de objeto, pero solo se nota cuando estás repitiendo millones de veces en el ciclo.

En mi humilde opinión, si el rendimiento es de vital importancia en su aplicación y desea exprimir incluso un solo nano segundo, entonces utilice int sin ningún cerebro. Pero si OO y la legibilidad son las principales afectadas, entonces use Integer.