A volte vedo che le API utilizzano long
o Long
o int
o Integer
e non riesco a capire come viene presa la decisione?
Quando dovrei scegliere cosa?
A volte vedo che le API utilizzano long
o Long
o int
o Integer
e non riesco a capire come viene presa la decisione?
Quando dovrei scegliere cosa?
Risposte:
Long
è la Object
forma di long
ed Integer
è la forma oggetto di int
.
Il long
utilizza 64 bit . Le int
utilizza 32 bit, e quindi può contenere solo numeri fino a ± 2 miliardi (-2 31 a +2 31 -1).
È necessario utilizzare long
e int
, tranne dove è necessario utilizzare metodi ereditati da Object
, ad esempio hashcode
. Java.util.collections
i metodi di solito usano le Object
versioni in box ( -wrapped), perché devono funzionare per qualsiasi Object
, e un tipo primitivo, come int
o long
, non è un Object
.
Un'altra differenza è che sono long
e pass-by-value , mentre e sono pass-by-reference value , come tutti i tipi Java non primitivi. Quindi, se fosse possibile modificare un o (non lo sono, sono immutabili senza usare il codice JNI), ci sarebbe un altro motivo per usarne uno rispetto all'altro.int
Long
Integer
Long
Integer
Un'ultima differenza è che a Long
o Integer
potrebbe essere null
.
Ci sono un paio di cose che non puoi fare con un tipo primitivo:
null
valoreObject
sA meno che tu non ne abbia bisogno, dovresti preferire i tipi primitivi, poiché richiedono meno memoria.
int
, quando tieni i numeri.int
è troppo piccolo, utilizzare along
long
è troppo piccolo, utilizzareBigInteger
Collection
, gestione null
, ...) usa Integer
/ Long
inveceAn int
è un numero intero a 32 bit; a long
è un numero intero a 64 bit. Quale usare dipende da quanto grandi sono i numeri con cui ti aspetti di lavorare.
int
e long
sono tipi primitivi, mentre Integer
e Long
sono oggetti. I tipi primitivi sono più efficienti, ma a volte è necessario utilizzare oggetti; per esempio, le classi di raccolta di Java può solo lavoro con gli oggetti, quindi se avete bisogno di una lista di interi che si devono fare una List<Integer>
, per esempio (non è possibile utilizzare int
in un List
diretto).
Int
32 bits (4byte)
-2,147,483,648 to 2,147,483,647
Long
64 bits (8byte)
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
Se l'utilizzo di una variabile rientra nell'intervallo a 32 bit, utilizzare Int
, altrimenti utilizzare long
. Di solito lungo viene usato per calcoli scientifici e cose del genere richiedono molta precisione. (es. valore di pi).
Un esempio di scelta l'uno sull'altro è il caso di YouTube. Per prima cosa hanno definito il contatore delle visualizzazioni video come un
int
overflow quando più di 2.147.483.647 visualizzazioni sono state ricevute per un video popolare. Poiché unInt
contatore non può memorizzare alcun valore oltre il suo intervallo, YouTube ha modificato il contatore in una variabile a 64 bit e ora può contare fino a 9.223.372.036.854.775.807 visualizzazioni. Comprendi i tuoi dati e scegli il tipo che si adatta come variabile a 64 bit occuperà il doppio della memoria rispetto a una variabile a 32 bit.
Quando si tratta di utilizzare un numero molto lungo che può superare i 32 bit da rappresentare, è possibile utilizzare long per assicurarsi di non avere comportamenti strani.
Da Java 5 è possibile utilizzare le funzionalità di boxing e out-boxing per rendere int e l'uso di int e Integer completamente uguali. Significa che puoi fare:
int myInt = new Integer(11);
Integer myInt2 = myInt;
Il dentro e fuori la boxe permettono di passare tra int e Integer senza alcuna conversione aggiuntivo (lo stesso per Long
, Double
, Short
troppo)
Puoi usare int
tutto il tempo, ma Integer
contiene alcuni metodi di aiuto che possono aiutarti a fare alcune operazioni complesse con numeri interi (come Integer.parseInt(String)
)
a) classe oggetto "Long" contro tipo primitivo "long". (Almeno in Java)
b) Esistono diverse (anche poco chiare) dimensioni di memoria dei tipi primitivi:
Java: tutto chiaro: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
C .. solo pasticcio: https://en.wikipedia.org/wiki/C_data_types