1. Liste over primitive typer

Java har 8 grundlæggende primitive typer. De kaldes primitive, fordi værdierne af disse typer ikke er objekter og er gemt direkte inde i variabler.

Her er en tabel med nogle korte oplysninger om disse typer:

Type Størrelse
i bytes
Værdiinterval Standard værdi Beskrivelse
byte 1 -128 .. 127 0 Den mindste heltalstype er en enkelt byte
short 2 -32.768 .. 32.767 0 Kort heltal, to bytes
int 4 -2*10 9 .. 2*10 9 0 Heltal, 4 bytes
long 8 -9*10 18 .. 9*10 18 0L Langt heltal, 8 bytes
float 4 -10 38 .. 10 38 0.0f Flydende kommanummer, 4 bytes
double 8 -10 308 .. 10 308 0.0d Dobbelt-præcision flydende decimaltal, 8 bytes
boolean 1 true,false false Boolesk type (kun trueog false)
char 2 0 ... 65,535 '\u0000' Tegn, 2 bytes, alle større end 0
Standard værdi

Forresten, her er en vigtig nuance. Hvis du erklærer en instansvariabel (felt) eller en statisk klassevariabel og ikke umiddelbart tildeler nogen værdi til den, initialiseres den med en standardværdi . Tabellen viser en liste over disse værdier.

Lokale variabler i en metode har ingen standardværdi. Hvis du ikke tildeler en værdi til sådanne variable, betragtes de som uinitialiserede og kan ikke bruges.

Men lad os vende tilbage til primitive typer og se nærmere på dem.



2. Heltalstyper

Java har 4 heltalstyper: byte, short, intog long. De adskiller sig i deres størrelse og rækkevidde af værdier, de kan gemme.

inttype

Den mest brugte er inttypen. Navnet kommer fra ordet int eger (helt tal). Alle heltallige bogstaver (heltal) i kode er ints(hvis de ikke ender på L, F, eller D).

Variabler af denne type kan tage værdier fra -2,147,483,648til +2,147,483,647.

Det er meget og er nok til næsten enhver lejlighed. Næsten hver funktion, der returnerer et tal, returnerer en int.

Eksempler:

Kode Forklaring
int n = "String".length();
Metoden length()returnerer længden af ​​en streng
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Feltet lengthindeholder længden af ​​arrayet.

shorttype

Typen shorthar sit navn fra short int. Det kaldes også ofte et kort heltal . I modsætning til inttypen er dens længde kun to bytes, og rækken af ​​mulige værdier er fra -32,768til +32,767.

Det betyder, at du ikke kan gemme tallet en million i den. Eller endda 50.000. Dette er den mest sjældent anvendte heltalstype i Java. Hovedmotivationen for at bruge det er at bevare hukommelsen.

Antag, at du har en situation, hvor du på forhånd ved, at du vil arbejde med værdier, der aldrig overstiger 30.000, og der vil være millioner af disse værdier.

Lad os f.eks. sige, at du skriver et program, der behandler billeder i ultrahøj opløsning, der bruger 10-bits pr. farve. Og du har en million pixels i dit billede. Dette er et scenarie, hvor beslutningen om at bruge inteller shorthar betydning.

longtype

Denne type får sit navn fra long intog kaldes også et langt heltal . I modsætning til inttypen har den et fabelagtigt enormt udvalg af værdier: fra til .-9*1018+9*1018

Hvorfor er det ikke den grundlæggende heltaltype?

Fordi Java dukkede op i midten af ​​90'erne, hvor de fleste computere var 32-bit. Det betyder, at alle processorer var optimeret til at arbejde med tal bestående af 32 bit. Processorer kunne arbejde med 64-bit heltal, men operationer med dem var langsommere.

Som et resultat besluttede programmører med rimelighed at lave intstandard heltalstypen og longkun at bruge typen, når det virkelig var nødvendigt.

bytetype

Dette er den mindste heltalstype i Java, men langt fra den mindst brugte. Dens navn, byte, er også ordet for den mindste adresserbare hukommelsesblok i Java.

Der er ikke så mange gyldige værdier for bytetypen: fra -128til +127. Men det er ikke dens styrke. Typen bytebruges oftest, når du skal gemme en stor klat-data i hukommelsen. En række bytes er ideel til dette formål.

Antag, at du skal kopiere en fil et sted.

Du behøver ikke at behandle indholdet af filen: du vil bare oprette et hukommelsesområde (buffer), kopiere indholdet af filen ind i den og derefter skrive disse data fra bufferen til en anden fil. Et bytearray er, hvad du har brug for til dette.

Husk, at en matrixvariabel kun gemmer en reference til et hukommelsesområde. Når variablen overføres til en eller anden metode, er det kun hukommelsesadressen, der overføres. Selve hukommelsesblokken kopieres ikke.

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. Rigtige typer

De primitive typer omfatter to typer for reelle tal. Selvom det ikke er helt korrekt at bruge det udtryk. Når computere håndterer rigtige tal, kalder vi dem floating-point-tal . Navnet kommer fra en standard til at repræsentere tal, hvor heltal og brøkdele af et tal er adskilt af et punktum (et punkt, ikke et komma).

Nogle nyttige oplysninger:

Hvert land har sine egne standarder for at skrive tal (overraskelse!).

Mange mennesker er vant til at bruge punktum til at adskille tusinder og kommaer som decimalseparator: for eksempel ville de skrive one million ones and 153 thousandthssom 1.000.000,153. Men i USA, hvor Javas skabere boede, blev en anden standard vedtaget:1000000.153

Java har to primitive typer med flydende komma: doubleog float.

Som vi sagde tidligere, har disse typer et meget specifikt internt arrangement: i hver variabel af disse typer er der faktisk ikke et tal, men to:

F.eks. 987654.321kan det flydende komma-tal repræsenteres som . Så vil det i hukommelsen blive repræsenteret som to tal ( mantissen , dvs. den betydelige del af tallet) og ( eksponent , dvs. en potens af ti)0.987654321*1069876543216

floattype

Navnet på floattypen kommer fra float ing-point number . Størrelsen af ​​denne type er ret lille - kun 4 bytes (32 bit) - men den kan gemme værdier fra til . 24 bit er allokeret til at repræsentere mantissen og 8 bit til eksponenten. Denne type er kun i stand til at gemme 8 signifikante cifre.-3.4*10383.4*1038

Denne tilgang gør det muligt at gemme meget større tal end en int, mens du bruger de samme 4 bytes. Men for at gøre det ofrer vi nøjagtigheden. Fordi en del af hukommelsen gemmer mantissen, lagrer disse variable kun 6-7 decimaler, mens resten kasseres.

Eksempel:

Kode Værdi
float a = (float) 123.456789;
123.45679
float a = (float) 12345.9999;
12346.0
float a = (float) -123.456789E-2;
-1.2345679

Som du kan se, er denne type største ulempe det meget lille antal signifikante cifre og tabet af præcision så snart det ottende ciffer. Derfor floater typen ikke særlig populær blandt Java-programmører.

doubletype

Typen doubleer standardtypen med flydende komma. Navnet kommer fra dobbelt præcision med flydende kommatal . Alle rigtige bogstaver er doubles som standard.

Denne type optager 8 bytes hukommelse (64 bit) og kan gemme værdier fra til . En vigtig ting at vide er, at 53 bit er allokeret til mantissen, mens de resterende 11 er til eksponenten.-1.7*103081.7*10308

Dette gør det muligt at lagre 15-17 signifikante cifre.

Eksempel:

Kode Værdi
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Denne præcision, især i sammenligning med floattypen, er afgørende: 99% af alle operationer med reelle tal udføres ved hjælp af doubletypen.

11bits er allokeret til eksponenten, hvilket betyder, at du kan gemme potenser på ti fra -323til +308(det er en potens af to fra -1024til +1023). Typen doublekan nemt gemme et tal med hundredvis af nuller efter decimaltegnet:

Kode Værdi
double a = 2E-300 * 3E+302
600.0


4. Uendelighed

Flydende kommatal har en anden interessant funktion: de kan gemme en speciel værdi, der angiver uendelig . Og du kan repræsentere positiv uendelighed og negativ uendelighed .

Eksempler:

Kode Bemærk
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

Hvis uendelighed ganges med et tal, får du uendelighed. Hvis du tilføjer et tal til uendeligt, får du uendeligt. Det er super praktisk.

Ikke et tal ( NaN)

Enhver operation, der involverer uendelighed, giver uendelig. Nå, de fleste, men ikke alle.

Flydende kommatal kan gemme en anden speciel værdi: NaN. Det er en forkortelse for N ot a N umber (ikke et tal).

I matematik, hvis du dividerer uendelighed med uendelig, er resultatet udefineret.

Men i Java, hvis du dividerer uendelighed med uendelig, er resultatet NaN.

Eksempler:

Kode Bemærk
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

Enhver operation med NaNudbytte NaN.



5. chartype

Blandt Javas primitive typer fortjener man noget særlig opmærksomhed: typen char. Dens navn kommer fra ordet tegn , og selve typen bruges til at gemme tegn .

Karakterer er hvad strenge er lavet af, ikke? Strenge er en række karakterer.

Men endnu mere interessant er det, at chartypen også er en numerisk type ! Det er en type med dobbelt formål, så at sige.

Virkeligheden er, at chartypen faktisk ikke har karakterer. I stedet gemmer den tegnkoder fra Unicode-kodningen. Hvert tegn svarer til et tal: tegnets numeriske kode.

Hver charvariabel optager to bytes i hukommelsen (det samme som shorttypen). Men i modsætning til shorttypen charer heltalstypen usigneret og kan gemme værdier fra 0til 65,535.

Typen charer en hybrid type. Dens værdier kan tolkes både som tal (f.eks. kan de lægges sammen og ganges) og som tegn. Dette blev gjort, fordi selvom karakterer er visuelle repræsentationer, er de for en computer frem for alt kun tal. Og det er meget mere praktisk at arbejde med dem som tal.

Unicode

Unicode er en speciel tabel (kodning), der indeholder alle tegn i verden. Og hver karakter har sit eget nummer. Det ser omtrent sådan ud:

Primitive typer i Java

Der er forskellige måder at tildele en værdi til en charvariabel.

Kode Beskrivelse
char a = 'A';
Variablen avil indeholde det latinske bogstav A.
char a = 65;
Variablen avil indeholde det latinske bogstav A. Dens kode er 65.
char a = 0x41;
Variablen avil indeholde det latinske bogstav A.
Dens kode er 65, som er lig 41i det hexadecimale system.
char a = 0x0041;
Variablen avil indeholde det latinske bogstav A.
Dens kode er 65, som er lig 41i det hexadecimale system.
De to ekstra nuller ændrer intet.
char a = '\u0041';
Variablen avil indeholde det latinske bogstav A.
En anden måde at definere et tegn ved dets kode.

Oftest angiver folk blot tegnet i anførselstegn (som i den første række i tabellen). Når det er sagt, er sidstnævnte metode også populær. Dens fordel er, at den kan bruges i strenge.

Og som vi sagde, charer typen også en heltalstype, så du kan skrive noget som dette:

Kode Konsoludgang
char a = 'A';
a++;
System.out.println(a);
Det latinske bogstav Bvil blive vist på skærmen.
Fordi:
A65
B66
C67

Arbejder med chars

Hver charer først og fremmest et tal (tegnkode) og derefter et tegn. Hvis du kender en tegnkode, kan du altid få tegnet i dit program. Eksempel:

Kode Konsoludgang
char c = (char) 1128;
System.out.println(c);

Ѩ

Standard koder

Her er de mest kendte tegnkoder:

Karakterer Koder
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. booleantype

Og den sidste primitive type er boolean.

Som du allerede ved, kan det kun tage to værdier: trueog false.

Og med det ved du allerede alt, hvad der er at vide om denne type.