Quale usare, int o Integer

Devo creare un object di trasferimento dati, che utilizzerò per archiviare i record recuperati dal database. In questo object di trasferimento dati, ho bisogno di dichiarare un campo numerico. Per quello che è meglio – int o intero

Se sto definendo il campo come Integer, ci sarà un impatto sulle prestazioni a causa del tipo ‘Integer’ se sto andando a recuperare più di 2000 record dal DB !?

Grazie in anticipo.

Integer è un’opzione migliore, in quanto può gestire null ; per int , null diventerebbe 0 , in silenzio, se viene utilizzato resultSet.getInt(..) . Altrimenti, potrebbe generare qualche eccezione, qualcosa come “Imansible impostare null a una proprietà primitiva”.

Le prestazioni sono di scarsa importanza qui.

  • se scegli int , int per aggiungere un ulteriore codice di gestione; e questo non ti gioverebbe molto. Il tuo codice non sarà pulito e diretto, molto codice della piastra della caldaia, e non otterrai nemmeno prestazioni.
  • lasciatemi chiarire, per i database, null non è uguale a zero. A volte si finisce con l’immissione di 0 , dove era previsto il valore null . Immagina il caso in cui l’utente ha inviato un modulo e non fornisce alcun valore per int . Alla fine otterrai 0 per impostazione predefinita. Ha senso, o lo è davvero, quando quel campo not null è not null nel database.

Dovresti davvero prendere una decisione basandoti su ciò di cui hai bisogno per fare il tuo object, piuttosto che sui costi delle prestazioni. Decidere in base alle prestazioni dovrebbe essere fatto, una volta che un problema di velocità è stato identificato con un profiler – la radice di tutto il male e tutto il resto.

Guarda alcune delle caratteristiche di entrambi e usa quello per la tua decisione, ad es

  • Integer può essere null , int no. Quindi l’ int nel campo DB a Nullable ?
  • Hai bisogno di accedere ai metodi della class Integer ?
  • Stai facendo aritmetica?

Personalmente, scelgo sempre il primitivo sul wrapper. Ma questa è solo una cosa preferenziale, piuttosto che basata su alcun merito tecnico.

A mio avviso, la scelta tra dichiarare qualcosa come int o Integer si riduce semplicemente al fatto che null sia o meno un valore valido. Autoboxing (e autounboxing) si prenderanno cura di eventuali problemi di conversione in cui il numero deve essere semplicemente di un tipo o di un altro. Anche la performance (come è stato sottolineato) è improbabile che sia evidente in quasi tutti i casi.

Inoltre, int dovrebbe essere la scelta naturale, ed è probabile che sia la più performante dovrebbe essere comunque un problema. Se è necessario essere in grado di memorizzare valori nulli, è necessario utilizzare Integer (e assicurarsi inoltre che nessun riferimento null sia auto-unboxed per un metodo che richiede semplicemente in quanto ciò comporterà una NullPointerException).

Integer è teoricamente più lento di int , tuttavia l’impatto sulle prestazioni dovrebbe essere minimo, a meno che non si tratti di numeri. Anche le ottimizzazioni JIT ridurranno la perdita di prestazioni.

Usa quello che meglio si adatta alla tua situazione in termini di tipo primitivo o di riferimento.

int è 10 volte più veloce del numero intero

testiamo questo codice con la libreria delle prestazioni di 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()); 

e i risultati:
test: oggetti 10.184
test: primitive 1.151

Per darti un’idea, 2000 Integer aggiungerebbe circa 0,5 ms alla tua query. Se devi serializzare questi dati potrebbe aggiungere un po ‘di più.

Tuttavia, la correttezza dovrebbe venire prima. Non ha senso essere molto veloce ma sbagliato. Devi considerare i valori nulli e come li gestisci. (A meno che la colonna NON sia NULL) Potresti usare Integer.MIN ___ VALUE oppure potresti usare un campo lungo invece di int e usare Long.MIN_VALUE per null. Anche se è più grande di int, sarebbe ancora molte volte più piccolo e più efficiente di Integer.

Immagino dipenda, tra l’altro, da cosa stai usando per accedere al database. Con il vecchio JDBC normale si poteva fare con int s, mentre un ORM poteva comunque convertirli in modo Integers in Integers . E Integer ti consentirebbe di gestire i null .

int è usato da java per la maggior parte di tutti i calcoli. Il numero intero viene utilizzato in tutte le forms di raccolte, ad eccezione degli array primitivi.

usando un sacco di interi temporanei con thrash il garbage collector e usa CPU non redditizia in background che causerà rallentamenti generali in tutto. Troppi provini che vengono trascinati al secondo causeranno l’ingresso di emergenza del computer in modalità “I need memory now” che può causare blocchi nelle applicazioni critiche in fase di latenza (ad esempio: grafica intertriggers in tempo reale, controller di dispositivi fisici o comunicazioni)

Quindi per me se ho un sacco di chiamate annidate che non fanno matematica ma accedono a molte collezioni come usare le chiavi per le mappe, io uso Integer per evitare tonnellate di box automatico quando gli argomenti vengono passati.

Se le operazioni sono ad uso intensivo di matematica o usate come contatori di loop o altre operazioni matematiche e non sono archiviate in raccolte (diverse dalle matrici primitive) uso la primitiva. Lo stesso vale per tutte le altre primitive tranne String, che è un object a tutti gli effetti.

int non può essere trasmesso alla String con l’utilizzo di toString o (String) .

Integer può eseguire il cast in String con toString o (String) e può gestire null .

Se si desidera verificare un valore null , l’ Integer è preferibile, ma se si desidera confrontare il numero intero, int potrebbe essere migliore. Nell’esempio seguente sto usando un intero c = 1000 e d = 1000 e lo confronto restituisce falso ma in caso di int restituiranno true.

 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"); } } }