Pregunta

En realidad here Es un tema similar con poco valor práctico. Según tengo entendido, las primitivas funcionan mejor y deberían usarse en todas partes, excepto en los casos en que se necesitan características relacionadas con el objeto (por ejemplo, la verificación null ). Derecho?

¿Fue útil?

Solución

No lo olvide, ya que crear un nuevo envoltorio para cada aparición de boxeo es bastante costoso, especialmente considerando que generalmente se usa en un solo ámbito de un método, Autoboxing utiliza un conjunto de envoltorios comunes.

De hecho, esta es una implementación de patrón de diseño de peso mosca . Cuando se produce un boxeo para un valor conocido, en lugar de crear una nueva instancia de contenedor, una instancia creada previamente se recupera de un grupo y se devuelve.

Una consecuencia es: todavía no se recomienda utilizar el autoboxing para cálculos científicos . Por ejemplo, el código d = a * b + c utiliza clases de enteros para a, b, c y d, y el código generado es d.valueOf (a.intValue () * b.intValue () + c.intValue ( )). Todas estas invocaciones de métodos tienen su propia sobrecarga, por lo que generalmente se recomienda usar autoboxing cuando sea necesario para almacenar primitivos en colecciones .

E incluso entonces, si tiene una gran colección de Integer wrapping int, la sobrecarga puede implicar tiempos de ejecución más largos, hasta 20 veces más , como informado en este artículo .


Jb agrega este comentario importante:

  

También Wrapper.valueOf (primitivo) usa el conjunto de envoltorios. Así que prefiero Integer.valueOf (5) al nuevo Integer (5)

Otros consejos

Las primitivas son más rápidas cuando se utilizan , ya que los objetos deben desempaquetarse antes de usarlos; por lo tanto, hay un paso adicional para que la VM realice. Por ejemplo, para realizar la aritmética en un entero, primero se debe convertir a un int antes de que se pueda realizar la aritmética.

En muchas aplicaciones comerciales, esto probablemente no importa. Pero si estuvieras escribiendo algo muy pesado, como un procesador de transformación de gráficos, es mucho más probable que te importe.

sí, los primitivos son más rápidos que los objetos. Desde java 5 incluso puedes mezclar primitivos y objetos sin convertir manualmente uno a otro. El mecanismo de autoboxing se encarga de eso.

esto significa que si pones una primitiva en una colección, el compilador no se quejará, y convierte la primitiva en un objeto implícitamente.

Si necesita almacenar primitivos en colecciones, puede usar commons-primitives .

Prefiero usar primitivas a envolturas, solo el lugar que absolutamente necesita tener envolturas son clases de entidad. Las bases de datos admiten nulos, por lo que las entidades también deberían hacerlo.

Una vez trabajé en un proyecto que usaba primitivos (y ORM de homebrew) en el acceso a la base de datos:

 class Foo{
    int xxx = -1;
 ...
 }

Y luego tenías:

 void persist(Foo foo){
     ...
     statement.setInt(15,foo.getXXX()==-1?null:foo.getXXX());
     ...
}

Dios era el mal.

Yo diría que debería preocuparse por el uso de primitivas sobre envoltorios solo cuando cree un perfil de su aplicación y vea que el autoboxing es un problema de rendimiento o de memoria. En mi experiencia, la memoria se convierte en un problema antes de los ciclos de CPU cuando se habla de primitivas contra objetos de envoltura.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top