1. Lista de tipuri primitive

Java are 8 tipuri primitive de bază. Ele sunt numite primitive deoarece valorile acestor tipuri nu sunt obiecte și sunt stocate direct în variabile.

Iată un tabel cu câteva informații scurte despre aceste tipuri:

Tip Dimensiunea
în octeți
Interval de valori Valoare implicită Descriere
byte 1 -128 .. 127 0 Cel mai mic tip întreg este un singur octet
short 2 -32.768 .. 32.767 0 Număr întreg scurt, doi octeți
int 4 -2*10 9 .. 2*10 9 0 Număr întreg, 4 octeți
long 8 -9*10 18 .. 9*10 18 0L Număr întreg lung, 8 octeți
float 4 -10 38 .. 10 38 0.0f Număr în virgulă mobilă, 4 octeți
double 8 -10 308 .. 10 308 0.0d Număr cu virgulă mobilă cu precizie dublă, 8 octeți
boolean 1 true,false false Tip boolean (numai trueși false)
char 2 0 .. 65.535 '\u0000' Caractere, 2 octeți, toate mai mari decât 0
Valoare implicită

Apropo, iată o nuanță importantă. Dacă declarați o variabilă de instanță (câmp) sau o variabilă de clasă statică și nu îi atribuiți imediat nicio valoare, atunci aceasta este inițializată cu o valoare implicită . Tabelul prezintă o listă a acestor valori.

Variabilele locale dintr-o metodă nu au valoare implicită. Dacă nu atribuiți o valoare unor astfel de variabile, acestea sunt considerate neinițializate și nu pot fi utilizate.

Dar să revenim la tipurile primitive și să le aruncăm o privire mai atentă.



2. Tipuri întregi

Java are 4 tipuri de numere întregi: byte, short, intși long. Ele diferă prin dimensiunea și gama de valori pe care le pot stoca.

inttip

Cel mai des folosit este inttipul. Numele provine de la cuvântul int eger (număr întreg). Toate literalele întregi (numerele întregi) din cod sunt ints(dacă nu se termină cu L, F, sau D).

Variabilele de acest tip pot lua valori de la -2,147,483,648până la +2,147,483,647.

Este mult și este suficient pentru aproape orice ocazie. Aproape fiecare funcție care returnează un număr returnează un int.

Exemple:

Cod Explicaţie
int n = "String".length();
Metoda length()returnează lungimea unui șir
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Câmpul lengthconține lungimea matricei.

shorttip

Tipul shortîși ia numele de la short int. Este adesea numit și un număr întreg scurt . Spre deosebire de inttip, lungimea sa este de numai doi octeți și intervalul de valori posibile este de la -32,768până la +32,767.

Asta înseamnă că nu poți stoca numărul un milion în el. Sau chiar 50.000. Acesta este cel mai rar folosit tip întreg în Java. Motivația principală pentru utilizare este conservarea memoriei.

Să presupunem că aveți o situație în care știți dinainte că veți lucra cu valori care nu depășesc niciodată 30.000 și vor exista milioane de aceste valori.

De exemplu, să presupunem că scrieți o aplicație care procesează imagini de definiție ultra-înaltă care utilizează 10-biți pe culoare. Și ai un milion de pixeli în imaginea ta. Acesta este un scenariu în care decizia de a utiliza intsau shortcontează.

longtip

Acest tip își trage numele long intși este numit și un întreg lung . Spre deosebire de inttip, are o gamă de valori fabulos de enormă: de la la .-9*1018+9*1018

De ce nu este tipul întreg de bază?

Pentru că Java a apărut la mijlocul anilor 90, când majoritatea computerelor erau pe 32 de biți. Asta înseamnă că toate procesoarele au fost optimizate pentru a lucra cu numere formate din 32 de biți. Procesoarele puteau funcționa cu numere întregi pe 64 de biți, dar operațiunile cu acestea au fost mai lente.

Ca rezultat, programatorii au decis în mod rezonabil să creeze inttipul întreg standard și să folosească longtipul numai atunci când este cu adevărat necesar.

bytetip

Acesta este cel mai mic tip întreg din Java, dar departe de a fi cel mai puțin utilizat. Numele său, byte, este, de asemenea, cuvântul pentru cel mai mic bloc de memorie adresabil din Java.

Nu există atât de multe valori valide pentru bytetipul: de la -128la +127. Dar asta nu este puterea lui. Tipul byteeste cel mai des folosit atunci când trebuie să stocați în memorie un blob mare. O matrice de bytes este ideală în acest scop.

Să presupunem că trebuie să copiați un fișier undeva.

Nu trebuie să procesați conținutul fișierului: doriți doar să creați o zonă de memorie (buffer), să copiați conținutul fișierului în ea și apoi să scrieți acele date din buffer într-un alt fișier. O bytematrice este ceea ce aveți nevoie pentru asta.

Rețineți că o variabilă matrice stochează doar o referință la o zonă de memorie. Când variabila este transmisă unei metode, este transmisă doar adresa de memorie. Blocul de memorie în sine nu este copiat.

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. Tipuri reale

Tipurile primitive includ două tipuri pentru numere reale. Deși nu este complet corect să folosiți acest termen. Când computerele manipulează numere reale, le numim numere în virgulă mobilă . Numele provine dintr-un standard pentru reprezentarea numerelor, în care părțile întregi și fracționale ale unui număr sunt separate printr-o punct (un punct, nu o virgulă).

Câteva informații utile:

Fiecare țară are propriile standarde de scriere a numerelor (surpriză!).

Mulți oameni sunt obișnuiți să folosească puncte pentru a separa miile și virgulele ca separator zecimal: de exemplu, ar scrie one million ones and 153 thousandthsca 1.000.000,153. Dar în Statele Unite, unde au trăit creatorii Java, a fost adoptat un alt standard:1000000.153

Java are două tipuri de primitive în virgulă mobilă: doubleși float.

După cum am spus mai devreme, aceste tipuri au un aranjament intern foarte specific: de fapt, în interiorul fiecărei variabile a acestor tipuri nu este un număr, ci două:

De exemplu, numărul în virgulă mobilă 987654.321poate fi reprezentat ca . Apoi în memorie va fi reprezentat ca două numere ( mantisa , adică partea semnificativă a numărului) și ( exponent , adică o putere de zece)0.987654321*1069876543216

floattip

Numele tipului floatprovine de la numărul în virgulă mobilă . Dimensiunea acestui tip este destul de mică - doar 4 octeți (32 de biți) - dar poate stoca valori de la până la . 24 de biți sunt alocați pentru reprezentarea mantisei și 8 biți pentru exponent. Acest tip este capabil să stocheze doar 8 cifre semnificative.-3.4*10383.4*1038

Această abordare face posibilă stocarea unor numere mult mai mari decât un int, folosind aceiași 4 octeți. Dar pentru a face acest lucru, sacrificăm acuratețea. Deoarece o parte din memorie stochează mantisa, aceste variabile stochează doar 6-7 zecimale, în timp ce restul sunt aruncate.

Exemplu:

Cod Valoare
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

După cum puteți vedea, principalul dezavantaj al acestui tip este numărul foarte mic de cifre semnificative și pierderea preciziei de îndată ce a opta cifră. De aceea floattipul nu este foarte popular printre programatorii Java.

doubletip

Tipul doubleeste tipul standard în virgulă mobilă. Numele provine de la numărul în virgulă mobilă cu precizie dublă . Toate literalele reale sunt doubles în mod implicit.

Acest tip ocupă 8 octeți de memorie (64 de biți) și poate stoca valori de la până la . Un lucru important de știut este că 53 de biți sunt alocați pentru mantise, în timp ce restul de 11 sunt pentru exponent.-1.7*103081.7*10308

Acest lucru permite stocarea a 15-17 cifre semnificative.

Exemplu:

Cod Valoare
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Această precizie, mai ales în comparație cu floattipul, este decisivă: 99% din toate operațiile cu numere reale sunt efectuate folosind tipul double.

11biții sunt alocați pentru exponent, ceea ce înseamnă că puteți stoca puteri de zece de la -323până la +308(aceasta este o putere de doi de la până -1024la +1023). Tipul doublepoate stoca cu ușurință un număr cu sute de zerouri după virgulă:

Cod Valoare
double a = 2E-300 * 3E+302
600.0


4. Infinitul

Numerele în virgulă mobilă au o altă caracteristică interesantă: pot stoca o valoare specială care denotă infinitul . Și puteți reprezenta infinitul pozitiv și infinitul negativ .

Exemple:

Cod Notă
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

Dacă infinitul este înmulțit cu un număr, obțineți infinit. Dacă adăugați un număr la infinit, obțineți infinit. E super convenabil.

Nu este un număr ( NaN​​)

Orice operație care implică infinit produce infinit. Ei bine, majoritatea, dar nu toate.

Numerele în virgulă mobilă pot stoca o altă valoare specială: NaN. Este prescurtarea pentru N o Număr (nu un număr ) .

În matematică, dacă împărțiți infinitul la infinit, rezultatul este nedefinit.

Dar, în Java, dacă împărțiți infinitul la infinit, rezultatul este NaN.

Exemple:

Cod Notă
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

Orice operațiune cu NaNrandamente NaN.



5. chartip

Printre tipurile primitive ale lui Javachar , unul merită o atenție specială: tipul. Numele său provine de la cuvântul caracter , iar tipul în sine este folosit pentru a stoca caractere .

Caracterele sunt din ce sunt făcute șirurile, nu? Șirurile sunt o matrice de caractere.

Dar și mai interesant este faptul că chartipul este și un tip numeric ! Este un tip cu dublu scop, ca să spunem așa.

Realitatea este că chartipul nu are caractere de fapt. În schimb, stochează coduri de caractere din codificarea Unicode. Fiecare caracter corespunde unui număr: codul numeric al personajului.

Fiecare charvariabilă ocupă doi octeți în memorie (la fel ca shorttipul). Dar, spre deosebire de shorttip, chartipul întreg este nesemnat și poate stoca valori de la 0până la 65,535.

Tipul chareste un tip hibrid. Valorile sale pot fi interpretate atât ca numere (de exemplu, pot fi adăugate și înmulțite) cât și ca caractere. Acest lucru a fost făcut pentru că, deși personajele sunt reprezentări vizuale, pentru un computer ele sunt mai presus de toate doar numere. Și este mult mai convenabil să lucrezi cu ele ca numere.

Unicode

Unicode este un tabel special (codificare) care conține toate caracterele din lume. Și fiecare personaj are propriul său număr. Arata cam asa:

Tipuri primitive în Java

Există diferite moduri de a atribui o valoare unei charvariabile.

Cod Descriere
char a = 'A';
Variabila ava conține litera latină A.
char a = 65;
Variabila ava conține litera latină A. Codul său este 65.
char a = 0x41;
Variabila ava conține litera latină A.
Codul său este 65, care este egal 41în sistemul hexazecimal.
char a = 0x0041;
Variabila ava conține litera latină A.
Codul său este 65, care este egal 41în sistemul hexazecimal.
Cele două zerouri în plus nu schimbă nimic.
char a = '\u0041';
Variabila ava conține litera latină A.
O altă modalitate de a defini un caracter prin codul său.

Cel mai adesea, oamenii indică pur și simplu caracterul între ghilimele (ca în primul rând al tabelului). Acestea fiind spuse, această din urmă metodă este, de asemenea, populară. Avantajul său este că poate fi folosit în șiruri.

Și așa cum am spus, chartipul este, de asemenea, un tip întreg, așa că puteți scrie ceva de genul acesta:

Cod Ieșire de consolă
char a = 'A';
a++;
System.out.println(a);
Litera latină Bva fi afișată pe ecran.
Pentru că:
A65
B66
C67

Lucrul cu chars

Fiecare chareste în primul rând un număr (cod caracter), apoi un caracter. Dacă cunoașteți un cod de caracter, puteți oricând să obțineți caracterul în programul dvs. Exemplu:

Cod Ieșire de consolă
char c = (char) 1128;
System.out.println(c);

Ѩ

Codurile standard

Iată cele mai cunoscute coduri de caractere:

Personaje Codurile
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. booleantip

Iar ultimul tip primitiv este boolean.

După cum știți deja, poate lua doar două valori: trueși false.

Și cu asta, știi deja tot ce este de știut despre acest tip.