Long vs Integer, long vs int, cosa usare e quando?


135

A volte vedo che le API utilizzano longo Longo into Integere non riesco a capire come viene presa la decisione?

Quando dovrei scegliere cosa?

Risposte:


191

Longè la Objectforma di longed Integerè la forma oggetto di int.

Il longutilizza 64 bit . Le intutilizza 32 bit, e quindi può contenere solo numeri fino a ± 2 miliardi (-2 31 a +2 31 -1).

È necessario utilizzare longe int, tranne dove è necessario utilizzare metodi ereditati da Object, ad esempio hashcode. Java.util.collectionsi metodi di solito usano le Objectversioni in box ( -wrapped), perché devono funzionare per qualsiasi Object, e un tipo primitivo, come into long, non è un Object.

Un'altra differenza è che sono longe 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.intLongIntegerLongInteger

Un'ultima differenza è che a Longo Integerpotrebbe essere null.


5
@Borealid, è così sbagliato, Java è sempre passa per valore, non c'è niente come passare per riferimento in Java.
Diego Ramos,

9
Uh Huh? Ok, esploriamo l'idea che Java non passa mai un riferimento. Se chiamo una funzione dandole un int [2], e poi all'interno della funzione cambio il valore contenuto nel primo elemento di quell'array, il chiamante della funzione vedrà quel cambiamento? Sì? Bene, perché ciò che è stato passato alla funzione non erano i valori nella matrice, ma piuttosto un riferimento a tali valori. "Passa per valore" significa che i dati stessi stessi vengono copiati senza alcuna indiretta. Chiunque ti abbia insegnato che Java era pass-by-value ti ha fatto un disservizio.
Borealid,

3
@Borealid non si è corretti, il valore è cambiato perché è stata creata una nuova copia del riferimento all'array, ecco perché chi chiama la funzione vedrà la modifica, questo è comunque passato per valore. Non posso credere che tu dica che esiste un pass per riferimento in Java. Non si passa mai il riferimento originale alla funzione.
Diego Ramos,

6
In un mondo teorico in cui Java si è comportato in modo completamente diverso da come funziona effettivamente, e il passaggio di un oggetto o di un array a una funzione ha prodotto una copia totalmente separata (in cui le modifiche all'interno della funzione non si riflettevano affatto sui chiamanti), come faresti descrivere la lingua? Tenendo presente che ciò di cui stiamo parlando non è completamente ciò che Java fa effettivamente.
Borealid,

2
@DiegoRamos ha ragione. Java passa sempre per valore, la confusione viene creata perché il valore quando non primitivo è un riferimento di memoria, lo scambio statico non funziona in Java, maggiori dettagli qui: journaldev.com/3884/…
Panthro,

28

Ci sono un paio di cose che non puoi fare con un tipo primitivo:

  • Avere un nullvalore
  • sincronizzarsi su di essi
  • Usali come parametro di tipo per una classe generica e relativi a quello:
  • Passali a un'API che funziona con Objects

A meno che tu non ne abbia bisogno, dovresti preferire i tipi primitivi, poiché richiedono meno memoria.


24
  • Di default usa un int, quando tieni i numeri.
  • Se l'intervallo di intè troppo piccolo, utilizzare along
  • Se l'intervallo di longè troppo piccolo, utilizzareBigInteger
  • Se hai bisogno di gestire i tuoi numeri come oggetto (ad esempio quando li metti in un Collection, gestione null, ...) usa Integer/ Longinvece

13

An 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.

inte longsono tipi primitivi, mentre Integere Longsono 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 intin un Listdiretto).


6

Intero è un tipo intero con segno a 32 bit

  • Indicato come Int
  • Dimensione = 32 bits (4byte)
  • Può contenere numeri interi di intervallo -2,147,483,648 to 2,147,483,647
  • il valore predefinito è 0


Long è un tipo intero a 64 bit con segno

  • Indicato come Long
  • Dimensione = 64 bits (8byte)
  • Può contenere numeri interi di intervallo -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
  • il valore predefinito è 0L


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 intoverflow quando più di 2.147.483.647 visualizzazioni sono state ricevute per un video popolare. Poiché un Intcontatore 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.


1

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, Shorttroppo)

Puoi usare int tutto il tempo, ma Integercontiene alcuni metodi di aiuto che possono aiutarti a fare alcune operazioni complesse con numeri interi (come Integer.parseInt(String))


0

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

  • byte, char .. 1B .. 8b
  • short int .. 2B .. 16b
  • int .. .. .. .. 4B .. 32b
  • long int .. 8B .. 64b

C .. solo pasticcio: https://en.wikipedia.org/wiki/C_data_types

  • breve .. .. 16b
  • int .. .. .. 16b ... wtf?!?!
  • lungo .. .. 32b
  • molto lungo .. 64b .. pasticcio! : - /

Questo non risponde alla domanda, che riguarda la differenza tra Long e long ecc.
GreenAsJade

No, non risponde esplicitamente, senza dire esplicitamente la differenza tra un tipo primitivo rispetto agli oggetti del tipo di dati, anzi @GreenAsJade, perché la domanda qui sopra non indica alcun linguaggio specifico. Quindi ho fornito un confronto, in modo che tutti possano verificare la differenza. (dai dati concreti, come fornito)
Franta

La domanda affermava Java.
GreenAsJade
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.