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 truee 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, shorte int. longDifferiscono per le dimensioni e l'intervallo di valori che possono memorizzare.
inttipo
Il più comunemente usato è il inttipo. Il nome deriva dalla parola int eger (numero intero). Tutti i letterali interi (numeri interi) nel codice sono ints(se non terminano con L, Fo D).
Le variabili di questo tipo possono assumere valori da -2,147,483,648a +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 lengthcampo contiene la lunghezza dell'array. |
shorttipo
Il shorttipo prende il nome da short int. Viene spesso chiamato anche numero intero breve . A differenza del inttipo, la sua lunghezza è di soli due byte e l'intervallo di valori possibili va da -32,768a +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 into shortè importante.
longtipo
Questo tipo prende il nome da long inted è anche chiamato long integer . A differenza del inttipo, 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 intil tipo intero standard e di utilizzare il longtipo solo quando veramente necessario.
bytetipo
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 bytetipo: from -128to +127. Ma non è questa la sua forza. Il bytetipo viene usato più spesso quando è necessario archiviare in memoria dati BLOB di grandi dimensioni. Un array di bytes è 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 bytearray è 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 thousandthscome 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: doublee 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.321può 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*1069876543216
floattipo
Il nome del floattipo 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*10383.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 floattipo non è molto popolare tra i programmatori Java.
doubletipo
Il doubletipo è il tipo a virgola mobile standard. Il nome deriva da numero a virgola mobile a doppia precisione . Tutti i valori letterali reali sono doubles 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*103081.7*10308
Ciò consente di memorizzare 15-17 cifre significative.
Esempio:
| Codice | Valore |
|---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Questa precisione, soprattutto rispetto al floattipo, è decisiva: il 99% di tutte le operazioni con numeri reali vengono eseguite utilizzando il doubletipo.
11i bit sono allocati per l'esponente, il che significa che puoi memorizzare potenze di dieci da -323a +308(che è una potenza di due da -1024a +1023). Il doubletipo 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 NaNrendimenti NaN.
5. chardigitare
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 chartipo è anche un tipo numerico ! È un tipo a doppio scopo, per così dire.
La realtà è che il chartipo 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 charvariabile occupa due byte in memoria (la stessa del shorttipo). Ma a differenza del shorttipo, il chartipo intero è senza segno e può memorizzare valori da 0a 65,535.
Il chartipo è 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 charvariabile.
| Codice | Descrizione |
|---|---|
|
La avariabile conterrà la lettera latina A. |
|
La avariabile conterrà la lettera latina A. Il suo codice è 65. |
|
La avariabile conterrà la lettera latina A. Il suo codice è 65, che equivale 41nel sistema esadecimale. |
|
La avariabile conterrà la lettera latina A. Il suo codice è 65, che equivale 41nel sistema esadecimale. I due zeri in più non cambiano nulla. |
|
La avariabile 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, charanche il tipo è un tipo intero, quindi puoi scrivere qualcosa del genere:
| Codice | Uscita console |
|---|---|
|
La lettera latina Bverrà visualizzata sullo schermo. Perché: A– 65B– 66C–67 |
Lavorare con chars
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. booleandigitare
E l'ultimo tipo primitivo è boolean.
Come già sai, può assumere solo due valori: truee false.
E con questo, sai già tutto quello che c'è da sapere su questo tipo.
GO TO FULL VERSION