1. Elenco dei tipi primitivi
Java ha 8 tipi primitivi di base. Sono chiamati primitivi perché i valori di questi tipi non sono oggetti e sono memorizzati direttamente all'interno delle variabili.
Ecco una tabella con alcune brevi informazioni su questi tipi:
Tipo | Dimensione in byte |
Intervallo di valori | Valore di default | Descrizione |
---|---|---|---|---|
byte |
1 | -128 .. 127 | 0 |
Il tipo intero più piccolo è un singolo byte |
short |
2 | -32.768 .. 32.767 | 0 |
Numero intero breve, due byte |
int |
4 | -2*10 9 .. 2*10 9 | 0 |
Numero intero, 4 byte |
long |
8 | -9*10 18 .. 9*10 18 | 0L |
Intero lungo, 8 byte |
float |
4 | -10 38 .. 10 38 | 0.0f |
Numero in virgola mobile, 4 byte |
double |
8 | -10 308 .. 10 308 | 0.0d |
Numero in virgola mobile a precisione doppia, 8 byte |
boolean |
1 | true ,false |
false |
Tipo booleano (solo true e false ) |
char |
2 | 0 .. 65.535 | '\u0000' |
Caratteri, 2 byte, tutti maggiori di 0 |
A proposito, ecco una sfumatura importante. Se dichiari una variabile di istanza (campo) o una variabile di classe statica e non le assegni immediatamente alcun valore, viene inizializzata con un valore predefinito . La tabella presenta un elenco di questi valori.
Le variabili locali in un metodo non hanno un valore predefinito. Se non si assegna un valore a tali variabili, vengono considerate non inizializzate e non possono essere utilizzate.
Ma torniamo ai tipi primitivi e diamo un'occhiata più da vicino.
2. Tipi interi
Java ha 4 tipi interi : byte
, short
e int
. long
Differiscono per le dimensioni e l'intervallo di valori che possono memorizzare.
int
tipo
Il più comunemente usato è il int
tipo. Il nome deriva dalla parola int eger (numero intero). Tutti i letterali interi (numeri interi) nel codice sono ints
(se non terminano con L
, F
o D
).
Le variabili di questo tipo possono assumere valori da -2,147,483,648
a +2,147,483,647
.
È molto ed è sufficiente per quasi tutte le occasioni. Quasi ogni funzione che restituisce un numero restituisce un int
.
Esempi:
Codice | Spiegazione |
---|---|
|
Il length() metodo restituisce la lunghezza di una stringa |
|
Il length campo contiene la lunghezza dell'array. |
short
tipo
Il short
tipo prende il nome da short int
. Viene spesso chiamato anche numero intero breve . A differenza del int
tipo, la sua lunghezza è di soli due byte e l'intervallo di valori possibili va da -32,768
a +32,767
.
Ciò significa che non puoi memorizzare il numero un milione al suo interno. O anche 50.000. Questo è il tipo intero usato più raramente in Java. La motivazione principale per usarlo è conservare la memoria.
Supponiamo di avere una situazione in cui sai in anticipo che lavorerai con valori che non superano mai 30.000 e che ci saranno milioni di questi valori.
Ad esempio, supponiamo che tu stia scrivendo un'applicazione che elabora immagini ad altissima definizione che utilizzano 10
-bit per colore. E hai un milione di pixel nella tua foto. Questo è uno scenario in cui la decisione di utilizzare int
o short
è importante.
long
tipo
Questo tipo prende il nome da long int
ed è anche chiamato long integer . A differenza del int
tipo, ha una gamma di valori favolosamente enorme: da a .-9*1018
+9*1018
Perché non è il tipo intero di base?
Perché Java è apparso a metà degli anni '90, quando la maggior parte dei computer era a 32 bit. Ciò significa che tutti i processori sono stati ottimizzati per lavorare con numeri costituiti da 32 bit. I processori potevano funzionare con numeri interi a 64 bit, ma le operazioni con essi erano più lente.
Di conseguenza, i programmatori hanno ragionevolmente deciso di creare int
il tipo intero standard e di utilizzare il long
tipo solo quando veramente necessario.
byte
tipo
Questo è il tipo intero più piccolo in Java, ma tutt'altro che meno utilizzato. Il suo nome, byte
, è anche la parola per il più piccolo blocco di memoria indirizzabile in Java.
Non ci sono molti valori validi per il byte
tipo: from -128
to +127
. Ma non è questa la sua forza. Il byte
tipo viene usato più spesso quando è necessario archiviare in memoria dati BLOB di grandi dimensioni. Un array di byte
s è l'ideale per questo scopo.
Supponiamo di dover copiare un file da qualche parte.
Non è necessario elaborare il contenuto del file: è sufficiente creare un'area di memoria (buffer), copiare il contenuto del file al suo interno e quindi scrivere i dati dal buffer in un altro file. Un byte
array è ciò di cui hai bisogno per questo.
Tieni presente che una variabile di matrice memorizza solo un riferimento a un'area di memoria. Quando la variabile viene passata a un metodo, viene passato solo l'indirizzo di memoria. Il blocco di memoria stesso non viene copiato.
byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
int size = sourceFile.read(buffer); // Read data from a file into a buffer
destFile.write(buffer, 0, size); // Write data from the buffer to a file
// Stop copying if the buffer is not full
if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();
3. Tipi reali
I tipi primitivi includono due tipi per i numeri reali. Anche se non è del tutto esatto usare quel termine. Quando i computer gestiscono numeri reali, li chiamiamo numeri in virgola mobile . Il nome deriva da uno standard per rappresentare i numeri, in cui le parti intere e frazionarie di un numero sono separate da un punto (un punto, non una virgola).
Ogni paese ha i propri standard per scrivere i numeri (sorpresa!).
Molte persone sono abituate a usare i punti per separare le migliaia e le virgole come separatore decimale: ad esempio, scriverebbero one million ones and 153 thousandths
come 1.000.000,153
. Ma negli Stati Uniti, dove vivevano i creatori di Java, è stato adottato uno standard diverso:1000000.153
Java ha due tipi primitivi a virgola mobile: double
e float
.
Come abbiamo detto in precedenza, questi tipi hanno una disposizione interna ben precisa: infatti, all'interno di ciascuna variabile di questi tipi non c'è un numero, ma due:
Ad esempio, il numero in virgola mobile 987654.321
può essere rappresentato come . Poi in memoria verrà rappresentato come due numeri (la mantissa , cioè la parte significativa del numero) e ( l'esponente , cioè una potenza di dieci)0.987654321*106
987654321
6
float
tipo
Il nome del float
tipo deriva da numero in virgola mobile . La dimensione di questo tipo è piuttosto piccola, solo 4 byte (32 bit), ma può memorizzare valori da a . 24 bit sono allocati per rappresentare la mantissa e 8 bit per l'esponente. Questo tipo è in grado di memorizzare solo 8 cifre significative.-3.4*1038
3.4*1038
Questo approccio consente di memorizzare numeri molto più grandi di un int
, utilizzando gli stessi 4 byte. Ma per farlo, sacrifichiamo la precisione. Poiché parte della memoria memorizza la mantissa, queste variabili memorizzano solo 6-7 cifre decimali mentre il resto viene scartato.
Esempio:
Codice | Valore |
---|---|
|
123.45679 |
|
12346.0 |
|
-1.2345679 |
Come puoi vedere, il principale svantaggio di questo tipo è il numero molto piccolo di cifre significative e la perdita di precisione non appena l'ottava cifra. Ecco perché il float
tipo non è molto popolare tra i programmatori Java.
double
tipo
Il double
tipo è il tipo a virgola mobile standard. Il nome deriva da numero a virgola mobile a doppia precisione . Tutti i valori letterali reali sono double
s per impostazione predefinita.
Questo tipo occupa 8 byte di memoria (64 bit) e può memorizzare valori da a . Una cosa importante da sapere è che 53 bit sono allocati per la mantissa, mentre i restanti 11 sono per l'esponente.-1.7*10308
1.7*10308
Ciò consente di memorizzare 15-17 cifre significative.
Esempio:
Codice | Valore |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Questa precisione, soprattutto rispetto al float
tipo, è decisiva: il 99% di tutte le operazioni con numeri reali vengono eseguite utilizzando il double
tipo.
11
i bit sono allocati per l'esponente, il che significa che puoi memorizzare potenze di dieci da -323
a +308
(che è una potenza di due da -1024
a +1023
). Il double
tipo può facilmente memorizzare un numero con centinaia di zeri dopo la virgola:
Codice | Valore |
---|---|
|
600.0 |
4. Infinito
I numeri in virgola mobile hanno un'altra caratteristica interessante: possono memorizzare un valore speciale che denota infinito . E puoi rappresentare l'infinito positivo e l'infinito negativo .
Esempi:
Codice | Nota |
---|---|
|
|
|
|
|
|
Se l'infinito viene moltiplicato per un numero, ottieni l'infinito. Se aggiungi un numero all'infinito, ottieni infinito. È super conveniente.
Non un numero ( NaN
)
Qualsiasi operazione che coinvolga l'infinito produce infinito. Bene, la maggior parte ma non tutti.
I numeri in virgola mobile possono memorizzare un altro valore speciale: NaN
. È l'abbreviazione di N ot a N umber (non un numero).
In matematica, se dividi infinito per infinito, il risultato è indefinito.
Ma, in Java, se dividi infinito per infinito, il risultato è NaN
.
Esempi:
Codice | Nota |
---|---|
|
|
|
|
|
|
Qualsiasi operazione con NaN
rendimenti NaN
.
5. char
digitare
Tra i tipi primitivi di Javachar
, uno merita una particolare attenzione: il tipo. Il suo nome deriva dalla parola char acter e il tipo stesso è utilizzato per memorizzare i caratteri.
I caratteri sono ciò di cui sono fatte le stringhe, giusto? Le stringhe sono un array di caratteri.
Ma ancora più interessante è il fatto che il char
tipo è anche un tipo numerico ! È un tipo a doppio scopo, per così dire.
La realtà è che il char
tipo in realtà non ha caratteri. Invece, memorizza i codici dei caratteri dalla codifica Unicode. Ad ogni carattere corrisponde un numero: il codice numerico del carattere.
Ogni char
variabile occupa due byte in memoria (la stessa del short
tipo). Ma a differenza del short
tipo, il char
tipo intero è senza segno e può memorizzare valori da 0
a 65,535
.
Il char
tipo è un tipo ibrido. I suoi valori possono essere interpretati sia come numeri (ad esempio possono essere sommati e moltiplicati) sia come caratteri. Ciò è stato fatto perché sebbene i caratteri siano rappresentazioni visive, per un computer sono soprattutto solo numeri. Ed è molto più conveniente lavorare con loro come numeri.
Unicode
Unicode è una tabella speciale (codifica) che contiene tutti i caratteri del mondo. E ogni personaggio ha il suo numero. Sembra approssimativamente così:
Esistono diversi modi per assegnare un valore a una char
variabile.
Codice | Descrizione |
---|---|
|
La a variabile conterrà la lettera latina A . |
|
La a variabile conterrà la lettera latina A . Il suo codice è 65 . |
|
La a variabile conterrà la lettera latina A . Il suo codice è 65 , che equivale 41 nel sistema esadecimale. |
|
La a variabile conterrà la lettera latina A . Il suo codice è 65 , che equivale 41 nel sistema esadecimale. I due zeri in più non cambiano nulla. |
|
La a variabile conterrà la lettera latina A . Un altro modo per definire un carattere in base al suo codice. |
Molto spesso, le persone indicano semplicemente il carattere tra virgolette (come nella prima riga della tabella). Detto questo, anche quest'ultimo metodo è popolare. Il suo vantaggio è che può essere utilizzato nelle stringhe.
E come abbiamo detto, char
anche il tipo è un tipo intero, quindi puoi scrivere qualcosa del genere:
Codice | Uscita console |
---|---|
|
La lettera latina B verrà visualizzata sullo schermo. Perché: A – 65 B – 66 C –67 |
Lavorare con char
s
Ognuno char
è prima di tutto un numero (codice carattere) e poi un carattere. Se conosci un codice carattere, puoi sempre ottenere il carattere nel tuo programma. Esempio:
Codice | Uscita console |
---|---|
|
|
Codici standard
Ecco i codici dei caratteri più noti:
Caratteri | Codici |
---|---|
0 , 1 , 2 , ...9 |
48 , 49 , 50 , ...57 |
a , b , c , ...z |
97 , 98 , 99 , ...122 |
A , B , C , ...Z |
65 , 66 , 67 , ...90 |
6. boolean
digitare
E l'ultimo tipo primitivo è boolean
.
Come già sai, può assumere solo due valori: true
e false
.
E con questo, sai già tutto quello che c'è da sapere su questo tipo.