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
Valore di default

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
int n = "String".length();
Il length()metodo restituisce la lunghezza di una stringa
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
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).

Alcune informazioni utili:

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
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-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
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
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
double a = 2E-300 * 3E+302
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
System.out.println( 100.0 / 0.0 );
Infinity
System.out.println( -100.0 / 0.0 );
-Infinity
double a = 1d / 0d;
double b = a * 10;
double c = b - 100;
a == Infinity
b == Infinity
c == Infinity

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
System.out.println(0.0 / 0.0);
NaN
double infinity = 1d / 0d;
System.out.println(infinity / infinity);

NaN
double a = 0.0 / 0.0;
double b = a * 10;
double c = b - 100;
double d = a + infinity;
a == NaN
b == NaN
c == NaN
d == NaN

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ì:

Tipi primitivi in ​​Java

Esistono diversi modi per assegnare un valore a una charvariabile.

Codice Descrizione
char a = 'A';
La avariabile conterrà la lettera latina A.
char a = 65;
La avariabile conterrà la lettera latina A. Il suo codice è 65.
char a = 0x41;
La avariabile conterrà la lettera latina A.
Il suo codice è 65, che equivale 41nel sistema esadecimale.
char a = 0x0041;
La avariabile conterrà la lettera latina A.
Il suo codice è 65, che equivale 41nel sistema esadecimale.
I due zeri in più non cambiano nulla.
char a = '\u0041';
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
char a = 'A';
a++;
System.out.println(a);
La lettera latina Bverrà visualizzata sullo schermo.
Perché:
A65
B66
C67

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
char c = (char) 1128;
System.out.println(c);

Ѩ

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.