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 |
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.
int
tip
Cel mai des folosit este int
tipul. 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,648
pâ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 |
---|---|
|
Metoda length() returnează lungimea unui șir |
|
Câmpul length conține lungimea matricei. |
short
tip
Tipul short
își ia numele de la short int
. Este adesea numit și un număr întreg scurt . Spre deosebire de int
tip, lungimea sa este de numai doi octeți și intervalul de valori posibile este de la -32,768
pâ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 int
sau short
contează.
long
tip
Acest tip își trage numele long int
și este numit și un întreg lung . Spre deosebire de int
tip, 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 int
tipul întreg standard și să folosească long
tipul numai atunci când este cu adevărat necesar.
byte
tip
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 byte
tipul: de la -128
la +127
. Dar asta nu este puterea lui. Tipul byte
este cel mai des folosit atunci când trebuie să stocați în memorie un blob mare. O matrice de byte
s 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 byte
matrice 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ă).
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 thousandths
ca 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.321
poate 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*106
987654321
6
float
tip
Numele tipului float
provine 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*1038
3.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 |
---|---|
|
123.45679 |
|
12346.0 |
|
-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 float
tipul nu este foarte popular printre programatorii Java.
double
tip
Tipul double
este tipul standard în virgulă mobilă. Numele provine de la numărul în virgulă mobilă cu precizie dublă . Toate literalele reale sunt double
s î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*10308
1.7*10308
Acest lucru permite stocarea a 15-17 cifre semnificative.
Exemplu:
Cod | Valoare |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Această precizie, mai ales în comparație cu float
tipul, este decisivă: 99% din toate operațiile cu numere reale sunt efectuate folosind tipul double
.
11
biții sunt alocați pentru exponent, ceea ce înseamnă că puteți stoca puteri de zece de la -323
până la +308
(aceasta este o putere de doi de la până -1024
la +1023
). Tipul double
poate stoca cu ușurință un număr cu sute de zerouri după virgulă:
Cod | Valoare |
---|---|
|
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ă |
---|---|
|
|
|
|
|
|
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ă |
---|---|
|
|
|
|
|
|
Orice operațiune cu NaN
randamente NaN
.
5. char
tip
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ă char
tipul este și un tip numeric ! Este un tip cu dublu scop, ca să spunem așa.
Realitatea este că char
tipul 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 char
variabilă ocupă doi octeți în memorie (la fel ca short
tipul). Dar, spre deosebire de short
tip, char
tipul întreg este nesemnat și poate stoca valori de la 0
până la 65,535
.
Tipul char
este 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:
Există diferite moduri de a atribui o valoare unei char
variabile.
Cod | Descriere |
---|---|
|
Variabila a va conține litera latină A . |
|
Variabila a va conține litera latină A . Codul său este 65 . |
|
Variabila a va conține litera latină A . Codul său este 65 , care este egal 41 în sistemul hexazecimal. |
|
Variabila a va 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. |
|
Variabila a va 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, char
tipul este, de asemenea, un tip întreg, așa că puteți scrie ceva de genul acesta:
Cod | Ieșire de consolă |
---|---|
|
Litera latină B va fi afișată pe ecran. Pentru că: A – 65 B – 66 C –67 |
Lucrul cu char
s
Fiecare char
este î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ă |
---|---|
|
|
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. boolean
tip
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.