1. Liste over primitive typer

Java har 8 grunnleggende primitive typer. De kalles primitive fordi verdiene til disse typene ikke er objekter og lagres direkte i variabler.

Her er en tabell med litt kort informasjon om disse typene:

Type Størrelse
i byte
Verdiområde Standardverdi Beskrivelse
byte 1 -128 .. 127 0 Den minste heltallstypen er en enkeltbyte
short 2 -32.768 .. 32.767 0 Kort heltall, to byte
int 4 -2*10 9 .. 2*10 9 0 Heltall, 4 byte
long 8 -9*10 18 .. 9*10 18 0L Langt heltall, 8 byte
float 4 -10 38 .. 10 38 0.0f Flytende tall, 4 byte
double 8 -10 308 .. 10 308 0.0d Flytende tall med dobbel presisjon, 8 byte
boolean 1 true,false false Boolsk type (bare trueog false)
char 2 0 ... 65,535 '\u0000' Tegn, 2 byte, alle større enn 0
Standardverdi

Forresten, her er en viktig nyanse. Hvis du erklærer en forekomstvariabel (felt) eller en statisk klassevariabel og ikke umiddelbart tilordner noen verdi til den, initialiseres den med en standardverdi . Tabellen viser en liste over disse verdiene.

Lokale variabler i en metode har ingen standardverdi. Hvis du ikke tildeler en verdi til slike variabler, anses de som uinitialiserte og kan ikke brukes.

Men la oss gå tilbake til primitive typer og se nærmere på dem.



2. Heltallstyper

Java har 4 heltallstyper: byte, short, intog long. De er forskjellige i størrelse og rekkevidde av verdier de kan lagre.

inttype

Den mest brukte er inttypen. Navnet kommer fra ordet int eger (helt tall). Alle heltalls bokstaver (hele tall) i kode er ints(hvis de ikke ender på L, F, eller D).

Variabler av denne typen kan ta verdier fra -2,147,483,648til +2,147,483,647.

Det er mye og er tilstrekkelig for nesten enhver anledning. Nesten hver funksjon som returnerer et tall, returnerer en int.

Eksempler:

Kode Forklaring
int n = "String".length();
Metoden length()returnerer lengden på en streng
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Feltet lengthinneholder lengden på matrisen.

shorttype

Typen shorthar fått navnet sitt fra short int. Det kalles også ofte et kort heltall . I motsetning til inttypen er dens lengde bare to byte og rekkevidden av mulige verdier er fra -32,768til +32,767.

Det betyr at du ikke kan lagre nummer én million i den. Eller til og med 50 000. Dette er den mest sjeldent brukte heltallstypen i Java. Hovedmotivasjonen for å bruke den er å spare på minnet.

Anta at du har en situasjon der du på forhånd vet at du kommer til å jobbe med verdier som aldri overstiger 30 000, og det vil være millioner av disse verdiene.

La oss for eksempel si at du skriver et program som behandler bilder med ultrahøy definisjon som bruker 10-bits per farge. Og du har en million piksler i bildet ditt. Dette er et scenario der beslutningen om å bruke inteller shortbetyr noe.

longtype

Denne typen får navnet sitt fra long intog kalles også et langt heltall . I motsetning til inttypen har den et fabelaktig enormt utvalg av verdier: fra til .-9*1018+9*1018

Hvorfor er det ikke den grunnleggende heltallstypen?

Fordi Java dukket opp på midten av 90-tallet, da de fleste datamaskiner var 32-biters. Det betyr at alle prosessorer ble optimalisert for å jobbe med tall som består av 32 biter. Prosessorer kunne fungere med 64-bits heltall, men operasjonene med dem gikk tregere.

Som et resultat bestemte programmerere rimeligvis å lage intstandard heltallstype, og å bruke longtypen bare når det virkelig var nødvendig.

bytetype

Dette er den minste heltallstypen i Java, men langt fra den minst brukte. Navnet, byte, er også ordet for den minste adresserbare minneblokken i Java.

Det er ikke så mange gyldige verdier for bytetypen: fra -128til +127. Men det er ikke dens styrke. Typen bytebrukes oftest når du skal lagre en stor blob-data i minnet. En rekke bytes er ideell for dette formålet.

Anta at du må kopiere en fil et sted.

Du trenger ikke å behandle innholdet i filen: du vil bare lage et minneområde (buffer), kopiere innholdet i filen inn i den, og deretter skrive disse dataene fra bufferen til en annen fil. En bytearray er det du trenger for dette.

Husk at en matrisevariabel bare lagrer en referanse til et minneområde. Når variabelen sendes til en eller annen metode, sendes bare minneadressen. Selve minneblokken blir ikke kopiert.

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

De primitive typene inkluderer to typer for reelle tall. Selv om det ikke er helt riktig å bruke det begrepet. Når datamaskiner håndterer reelle tall, kaller vi dem flytende tall . Navnet kommer fra en standard for å representere tall, der heltalls- og brøkdelene av et tall er atskilt med et punktum (et punkt, ikke et komma).

Litt nyttig informasjon:

Hvert land har sine egne standarder for å skrive tall (overraskelse!).

Mange mennesker er vant til å bruke punktum for å skille tusenvis og kommaer som desimalskilletegn: for eksempel vil de skrive one million ones and 153 thousandthssom 1.000.000,153. Men i USA, der Javas skapere bodde, ble en annen standard tatt i bruk:1000000.153

Java har to primitive flytepunktstyper: doubleog float.

Som vi sa tidligere, har disse typene et veldig spesifikt internt arrangement: faktisk inne i hver variabel av disse typene er det ikke ett tall, men to:

Flytende kommanummer 987654.321kan for eksempel representeres som . Da vil det i minnet bli representert som to tall ( mantissen , dvs. den betydelige delen av tallet) og ( eksponent , dvs. en potens av ti)0.987654321*1069876543216

floattype

Navnet på floattypen kommer fra flytende punktnummer . Størrelsen på denne typen er ganske liten — bare 4 byte (32 bits) — men den kan lagre verdier fra til . 24 biter er tildelt for å representere mantissen, og 8 biter for eksponenten. Denne typen er i stand til å lagre bare 8 signifikante sifre.-3.4*10383.4*1038

Denne tilnærmingen gjør det mulig å lagre mye større tall enn en int, mens du bruker de samme 4 bytene. Men for å gjøre det, ofrer vi nøyaktighet. Fordi en del av minnet lagrer mantissen, lagrer disse variablene bare 6-7 desimaler mens resten forkastes.

Eksempel:

Kode Verdi
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 typens største ulempe det svært lille antallet signifikante siffer, og tap av presisjon så snart det åttende sifferet. Det er derfor floattypen ikke er veldig populær blant Java-programmerere.

doubletype

Typen doubleer standard flytende kommatype. Navnet kommer fra dobbel presisjons flyttall . Alle virkelige bokstaver er doubles som standard.

Denne typen tar opp 8 byte minne (64 biter) og kan lagre verdier fra til . En viktig ting å vite er at 53 biter er tildelt for mantissen, mens de resterende 11 er for eksponenten.-1.7*103081.7*10308

Dette gjør at 15-17 signifikante sifre kan lagres.

Eksempel:

Kode Verdi
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Denne presisjonen, spesielt i sammenligning med floattypen, er avgjørende: 99 % av alle operasjoner med reelle tall utføres ved bruk av doubletypen.

11bits er tildelt for eksponenten, noe som betyr at du kan lagre potenser på ti fra -323til +308(det er en potens av to fra -1024til +1023). Typen doublekan enkelt lagre et tall med hundrevis av nuller etter desimaltegn:

Kode Verdi
double a = 2E-300 * 3E+302
600.0


4. Uendelig

Flytende tall har en annen interessant funksjon: de kan lagre en spesiell verdi som angir uendelig . Og du kan representere positiv uendelighet og negativ uendelighet .

Eksempler:

Kode Merk
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 uendelighet multipliseres med et tall, får du uendelig. Hvis du legger til et tall til uendelig, får du uendelig. Det er super praktisk.

Ikke et tall ( NaN)

Alle operasjoner som involverer uendelig gir uendelig. Vel, de fleste, men ikke alle.

Flytende tall kan lagre en annen spesiell verdi: NaN. Det er forkortelse for N ot a N umber (ikke et tall).

I matematikk, hvis du deler uendelig med uendelig, er resultatet udefinert.

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

Eksempler:

Kode Merk
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 operasjon med NaNutbytte NaN.



5. chartype

Blant Javas primitive typer fortjener en spesiell oppmerksomhet: typen char. Navnet kommer fra ordet karakter , og selve typen brukes til å lagre tegn .

Karakterer er hva strenger er laget av, ikke sant? Strenger er en rekke karakterer.

Men enda mer interessant er det at chartypen også er en numerisk type ! Det er en type med to formål, for å si det sånn.

Realiteten er at chartypen faktisk ikke har karakterer. I stedet lagrer den tegnkoder fra Unicode-kodingen. Hvert tegn tilsvarer et tall: tegnets numeriske kode.

Hver charvariabel opptar to byte i minnet (det samme som shorttypen). Men i motsetning til shorttypen, charer heltallstypen usignert og kan lagre verdier fra 0til 65,535.

Typen charer en hybrid type. Verdiene kan tolkes både som tall (f.eks. kan de adderes og multipliseres) og som tegn. Dette ble gjort fordi selv om karakterer er visuelle representasjoner, er de for en datamaskin fremfor alt bare tall. Og det er mye mer praktisk å jobbe med dem som tall.

Unicode

Unicode er en spesiell tabell (koding) som inneholder alle tegnene i verden. Og hver karakter har sitt eget nummer. Det ser omtrent slik ut:

Primitive typer i Java

Det er forskjellige måter å tilordne en verdi til en charvariabel.

Kode Beskrivelse
char a = 'A';
Variabelen avil inneholde den latinske bokstaven A.
char a = 65;
Variabelen avil inneholde den latinske bokstaven A. Koden er 65.
char a = 0x41;
Variabelen avil inneholde den latinske bokstaven A.
Koden er 65, som er lik 41i det heksadesimale systemet.
char a = 0x0041;
Variabelen avil inneholde den latinske bokstaven A.
Koden er 65, som er lik 41i det heksadesimale systemet.
De to ekstra nullene endrer ingenting.
char a = '\u0041';
Variabelen avil inneholde den latinske bokstaven A.
En annen måte å definere et tegn ved koden.

Oftest angir folk ganske enkelt tegnet i anførselstegn (som i den første raden i tabellen). Når det er sagt, er sistnevnte metode også populær. Fordelen er at den kan brukes i strenger.

Og som vi sa, chartypen er også en heltallstype, så du kan skrive noe som dette:

Kode Konsollutgang
char a = 'A';
a++;
System.out.println(a);
Den latinske bokstaven Bvil vises på skjermen.
Fordi:
A65
B66
C67

Arbeider med chars

Hver charer først og fremst et tall (tegnkode), og deretter et tegn. Hvis du kjenner en tegnkode, kan du alltid få tegnet i programmet ditt. Eksempel:

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

Ѩ

Standard koder

Her er de mest kjente tegnkodene:

Tegn 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 siste primitive typen er boolean.

Som du allerede vet, kan det bare ta to verdier: trueog false.

Og med det vet du allerede alt som er å vite om denne typen.