java - to_date - timestamp h2 example
Cuál usar, int o entero (10)
Necesito crear un objeto de transferencia de datos, que usaré para almacenar los registros recuperados de la base de datos. En este objeto de transferencia de datos, necesito declarar un campo numérico. Para lo que uno es mejor - int o entero
Si estoy definiendo el campo como Integer, ¿habrá algún impacto en el rendimiento debido al tipo ''Integer'' si voy a recuperar más de 2000 registros de DB?
Gracias por adelantado.
int es utilizado por Java para la mayoría de los cálculos. El entero se usa en todas las formas de colecciones, excepto para las matrices primitivas.
utilizando muchos Integers temporales con Thrash el recolector de basura y utiliza CPU no disponible en segundo plano que causará ralentizaciones generales en todo. Demasiados temporarios que se eliminan por segundo provocarán que el CG entre en el modo de emergencia "Necesito memoria ahora" que puede causar pérdida de espacio en aplicaciones críticas de latencia (es decir, gráficos interactivos en tiempo real, controladores de dispositivos físicos o comunicaciones)
Entonces, para mí, si tengo muchas llamadas anidadas que no hacen cálculos pero accedo a muchas colecciones, como usar claves para mapas, utilizo Integer para evitar montones de auto boxeo cuando se pasan los argumentos.
Si las operaciones son intensivas en matemáticas o se usan como contadores de bucle u otras operaciones orientadas a la matemática y no se almacenan en colecciones (que no sean matrices primitivas) utilizo la primitiva. Lo mismo ocurre con todas las otras primitivas, excepto String, que es un objeto de pleno derecho.
En mi opinión, la elección entre declarar algo como int o entero simplemente se reduce a si null es un valor válido para él o no. Autoboxing (y autounboxing) se ocupará de cualquier problema de conversión donde el número simplemente debe ser de un tipo u otro. El rendimiento (como se ha señalado) también es poco probable que sea notorio en casi todos los casos.
Además, int debería ser la opción natural, y es probable que sea el mejor rendimiento si ese fuera un problema de todos modos. Si necesita poder almacenar valores nulos, entonces debe usar Entero (y también asegurarse de que ninguna referencia nula se destraba automáticamente para un método que toma simplemente datos, ya que esto dará como resultado una ExcepciónNivelPobular).
Supongo que depende, entre otras cosas, de lo que está utilizando para acceder a la base de datos. Con el antiguo JDBC normal, podrías hacerlo con int
s, mientras que un ORM podría convertirlos en Integers
todos modos. E Integer le permitiría manejar nulos .
Integer
es teóricamente más lento que int
, sin embargo, el impacto en el rendimiento debe ser mínimo a menos que estés haciendo cálculos crujientes. Además, las optimizaciones de JIT reducirán la pérdida de rendimiento.
Utilice el que mejor se adapte a su situación en términos de tipo primitivo o de referencia.
Para darle una idea, 2000 Integer agregaría aproximadamente 0.5 ms a su consulta. Si tiene que serializar estos datos, podría agregar un poco más.
Sin embargo, la corrección debe ser lo primero. No tiene sentido ser muy rápido pero equivocado. Debe considerar valores nulos y cómo los maneja. (A menos que la columna NO sea NULL) Puede usar Integer.MIN ___ VALUE o puede usar un campo largo en lugar de int y usar Long.MIN_VALUE para null. Aunque es más grande que int, aún sería mucho más pequeño y más eficiente que Integer.
int es 10 veces más rápido que el número entero
probamos este código con la biblioteca de rendimiento de jetm
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
y los resultados:
prueba: objetos 10.184
prueba: primitivas 1.151
int
no se puede convertir a String
con el uso de toString
o (String)
.
Integer
puede convertir a String
con toString
o (String)
y puede manejar null
.
En realidad, debe tomar su decisión en función de lo que necesita que haga su objeto, en lugar de los costos de rendimiento. Se debe tomar una decisión basada en el rendimiento, una vez que se ha identificado un problema de velocidad con un generador de perfiles: la raíz de todo mal y todo eso.
Observe algunas de las características de ambos y utilícelas para su decisión, por ej.
-
Integer
puede sernull
,int
no puede. Entonces, ¿elint
en el DB es un campoNullable
? - ¿Necesitas acceso a los métodos de clase
Integer
? - ¿Estás haciendo aritmética?
Personalmente, siempre opto por lo primitivo sobre el contenedor. Pero eso es solo una preferencia, en lugar de basarse en ningún mérito técnico.
Integer
es una mejor opción, ya que puede manejar null
; para int
, null
se convertiría en 0
, en silencio, si se usa resultSet.getInt(..)
. De lo contrario, podría arrojar alguna excepción, algo así como, "No se puede establecer null
a una propiedad primitiva".
El rendimiento es de poca importancia aquí.
- si eliges
int
, terminarás agregando código de manejo extra; y eso no te beneficiaría mucho. Su código no será limpio y sencillo, ni mucho código de placa de caldera, y ni siquiera obtendría rendimiento. - permítanme dejarlo en claro, para las bases de datos, null no es lo mismo que cero. Algunas veces terminas ingresando
0
, donde se pretendía que fueranull
. Imagine el caso en que el usuario envió un formulario y no proporciona ningún valor paraint
. Obtendrás0
por defecto. Tiene sentido, o lo hace realmente, cuando ese camponot null
esnot null
en la base de datos.
Si desea comprobar un valor null
, Integer
es mejor, pero si desea comparar el entero, int puede ser mejor. En el siguiente ejemplo, estoy usando enteros c = 1000 yd = 1000 y lo comparo devuelven falso pero en caso de int devolverán verdadero.
public class IntegerCompare {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
Integer c = 1000;
Integer d = 1000;
if (a == b) {
System.out.println("int Value Equals");
}
if (c == d) {
System.out.println("Integer value Equals");
} else {
System.out.println("Integer Value Not Equals");
}
}
}