1. Lista över primitiva typer

Java har 8 grundläggande primitiva typer. De kallas primitiva eftersom värdena för dessa typer inte är objekt och lagras direkt inuti variabler.

Här är en tabell med lite kort information om dessa typer:

Typ Storlek
i byte
Värdeintervall Standardvärde Beskrivning
byte 1 -128 .. 127 0 Den minsta heltalstypen är en enda byte
short 2 -32,768 .. 32,767 0 Kort heltal, två byte
int 4 -2*10 9 .. 2*10 9 0 Heltal, 4 byte
long 8 -9*10 18 .. 9*10 18 0L Långt heltal, 8 byte
float 4 -10 38 .. 10 38 0.0f Flyttal, 4 byte
double 8 -10 308 .. 10 308 0.0d Flyttal med dubbel precision, 8 byte
boolean 1 true,false false boolesk typ (endast trueoch false)
char 2 0 ... 65,535 '\u0000' Tecken, 2 byte, alla större än 0
Standardvärde

Förresten, här är en viktig nyans. Om du deklarerar en instansvariabel (fält) eller en statisk klassvariabel och inte omedelbart tilldelar något värde till den, initieras den med ett standardvärde . Tabellen visar en lista över dessa värden.

Lokala variabler i en metod har inget standardvärde. Om du inte tilldelar ett värde till sådana variabler anses de vara oinitierade och kan inte användas.

Men låt oss återgå till primitiva typer och titta närmare på dem.



2. Heltalstyper

Java har fyra heltalstyper: byte, short, intoch long. De skiljer sig åt i sin storlek och utbudet av värden de kan lagra.

inttyp

Den vanligaste är inttypen. Namnet kommer från ordet int eger (heltal). Alla heltalsliteraler (heltal) i koden är ints(om de inte slutar på , , Leller F) D.

Variabler av denna typ kan ta värden från -2,147,483,648till +2,147,483,647.

Det är mycket och räcker för nästan alla tillfällen. Nästan varje funktion som returnerar ett tal returnerar en int.

Exempel:

Koda Förklaring
int n = "String".length();
Metoden length()returnerar längden på en sträng
String[] array = {"Tic", "Tac", "Toe"};
int n = array.length;
Fältet lengthinnehåller längden på arrayen.

shorttyp

Typen shorthar fått sitt namn från short int. Det kallas också ofta för ett kort heltal . Till skillnad från inttypen är dess längd bara två byte och intervallet för möjliga värden är från -32,768till +32,767.

Det betyder att du inte kan lagra siffran en miljon i den. Eller till och med 50 000. Detta är den mest sällan använda heltalstypen i Java. Den främsta motivationen för att använda den är att spara på minnet.

Anta att du har en situation där du i förväg vet att du kommer att arbeta med värden som aldrig överstiger 30 000, och det kommer att finnas miljontals av dessa värden.

Låt oss till exempel säga att du skriver ett program som bearbetar bilder med ultrahög upplösning som använder 10-bitar per färg. Och du har en miljon pixlar i din bild. Detta är ett scenario där beslutet att använda inteller shorthar betydelse.

longtyp

Denna typ har fått sitt namn från long intoch kallas även ett långt heltal . Till skillnad från inttypen har den ett fantastiskt enormt utbud av värden: från till .-9*1018+9*1018

Varför är det inte den grundläggande heltalstypen?

Eftersom Java dök upp i mitten av 90-talet, då de flesta datorer var 32-bitars. Det betyder att alla processorer var optimerade för att arbeta med tal som består av 32 bitar. Processorer kunde arbeta med 64-bitars heltal, men operationerna med dem var långsammare.

Som ett resultat beslutade programmerare rimligen att göra intstandard heltalstyp och att använda longtypen endast när det verkligen var nödvändigt.

bytetyp

Detta är den minsta heltalstypen i Java, men långt ifrån den minst använda. Dess namn, byte, är också ordet för det minsta adresserbara minnesblocket i Java.

Det finns inte så många giltiga värden för bytetypen: från -128till +127. Men det är inte dess styrka. Typen byteanvänds oftast när du behöver lagra en stor blobdata i minnet. En uppsättning bytes är idealisk för detta ändamål.

Anta att du behöver kopiera en fil någonstans.

Du behöver inte bearbeta innehållet i filen: du vill bara skapa ett minnesområde (buffert), kopiera innehållet i filen till den och sedan skriva data från bufferten till en annan fil. En bytearray är vad du behöver för detta.

Tänk på att en arrayvariabel endast lagrar en referens till ett minnesområde. När variabeln skickas till någon metod skickas endast minnesadressen. Själva minnesblocket kopieras inte.

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

De primitiva typerna inkluderar två typer för reella tal. Även om det inte är helt korrekt att använda den termen. När datorer hanterar riktiga tal kallar vi dem flyttalstal . Namnet kommer från en standard för att representera tal, där heltals- och bråkdelar av ett tal separeras med en punkt (en punkt, inte ett kommatecken).

Lite användbar information:

Varje land har sina egna standarder för att skriva siffror (överraskning!).

Många människor är vana vid att använda punkter för att separera tusentals och kommatecken som decimalavgränsare: till exempel skulle de skriva one million ones and 153 thousandthssom 1.000.000,153. Men i USA, där Javas skapare bodde, antogs en annan standard:1000000.153

Java har två primitiva flyttalstyper: doubleoch float.

Som vi sa tidigare har dessa typer ett mycket specifikt internt arrangemang: inuti varje variabel av dessa typer finns faktiskt inte ett nummer, utan två:

Till exempel kan flyttalstalet 987654.321representeras som . Sedan i minnet kommer det att representeras som två tal ( mantissan , dvs den signifikanta delen av talet) och ( exponent , dvs en tiopotens)0.987654321*1069876543216

floattyp

Namnet på floattypen kommer från float ing-point number . Storleken på den här typen är ganska liten — endast 4 byte (32 bitar) — men den kan lagra värden från till . 24 bitar tilldelas för att representera mantissan och 8 bitar för exponenten. Denna typ kan endast lagra 8 signifikanta siffror.-3.4*10383.4*1038

Detta tillvägagångssätt gör det möjligt att lagra mycket större tal än en , intsamtidigt som man använder samma 4 byte. Men för att göra det offrar vi noggrannheten. Eftersom en del av minnet lagrar mantissan, lagrar dessa variabler endast 6-7 decimaler medan resten kasseras.

Exempel:

Koda Värde
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 är den här typens största nackdel det mycket lilla antalet signifikanta siffror och förlusten av precision så snart som den åttonde siffran. Det är därför floattypen inte är särskilt populär bland Java-programmerare.

doubletyp

Typen doubleär den vanliga flyttalstypen. Namnet kommer från dubbla precisionsflyttal . Alla riktiga bokstaver är doubles som standard.

Denna typ tar upp 8 byte minne (64 bitar) och kan lagra värden från till . En viktig sak att veta är att 53 bitar tilldelas för mantissan, medan de återstående 11 är för exponenten.-1.7*103081.7*10308

Detta gör att 15-17 signifikanta siffror kan lagras.

Exempel:

Koda Värde
double a = 1234567890.1234567890;
1234567890.1234567
double a = 1234567890.1234512345;
1234567890.1234512
double a = 1234567890.1357913579;
1234567890.1357913

Denna precision, särskilt i jämförelse med floattypen, är avgörande: 99% av alla operationer med reella tal utförs med hjälp av typen double.

11bitar tilldelas för exponenten, vilket innebär att du kan lagra tiopotenser från -323till +308(det är en potens av två från -1024till +1023). Typen doublekan enkelt lagra ett tal med hundratals nollor efter decimalkomma:

Koda Värde
double a = 2E-300 * 3E+302
600.0


4. Oändlighet

Flyttal har en annan intressant egenskap: de kan lagra ett speciellt värde som anger oändlighet . Och du kan representera positiv oändlighet och negativ oändlighet .

Exempel:

Koda Notera
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

Om oändlighet multipliceras med ett tal får du oändlighet. Lägger du till ett tal till oändligheten får du oändlighet. Det är super bekvämt.

Inte ett nummer ( NaN)

Alla operationer som involverar oändlighet ger oändlighet. Tja, de flesta men inte alla.

Flyttal kan lagra ett annat specialvärde: NaN. Det är en förkortning för N ot a N umber (inte ett nummer).

I matematik, om du delar oändlighet med oändlighet, är resultatet odefinierat.

Men i Java, om du delar oändlighet med oändlighet, blir resultatet NaN.

Exempel:

Koda Notera
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

Alla operationer med NaNavkastning NaN.



5. chartyp

Bland Javas primitiva typer förtjänar en särskild uppmärksamhet: chartypen. Dess namn kommer från ordet tecken , och själva typen används för att lagra tecken .

Karaktärer är vad strängar är gjorda av, eller hur? Strängar är en rad tecken.

Men ännu mer intressant är det faktum att chartypen också är en numerisk typ ! Det är en typ med två syften, så att säga.

Verkligheten är att chartypen faktiskt inte karaktärer. Istället lagrar den teckenkoder från Unicode-kodningen. Varje tecken motsvarar ett nummer: tecknets numeriska kod.

Varje charvariabel upptar två byte i minnet (samma som shorttypen). Men till skillnad från shorttypen charär heltalstypen osignerad och kan lagra värden från 0till 65,535.

Typen charär en hybridtyp. Dess värden kan tolkas både som tal (t.ex. kan de adderas och multipliceras) och som tecken. Detta gjordes för att även om karaktärer är visuella representationer, är de för en dator framför allt bara siffror. Och det är mycket bekvämare att arbeta med dem som siffror.

Unicode

Unicode är en speciell tabell (kodning) som innehåller alla tecken i världen. Och varje karaktär har sitt eget nummer. Det ser ungefär ut så här:

Primitiva typer i Java

Det finns olika sätt att tilldela ett värde till en charvariabel.

Koda Beskrivning
char a = 'A';
Variabeln akommer att innehålla den latinska bokstaven A.
char a = 65;
Variabeln akommer att innehålla den latinska bokstaven A. Dess kod är 65.
char a = 0x41;
Variabeln akommer att innehålla den latinska bokstaven A.
Dess kod är 65, vilket är lika 41i det hexadecimala systemet.
char a = 0x0041;
Variabeln akommer att innehålla den latinska bokstaven A.
Dess kod är 65, vilket är lika 41i det hexadecimala systemet.
De två extra nollorna ändrar ingenting.
char a = '\u0041';
Variabeln akommer att innehålla den latinska bokstaven A.
Ett annat sätt att definiera ett tecken med dess kod.

Oftast anger människor helt enkelt tecknet inom citattecken (som i den första raden i tabellen). Som sagt, den senare metoden är också populär. Dess fördel är att den kan användas i strängar.

Och som vi sa, chartypen är också en heltalstyp, så du kan skriva något så här:

Koda Konsolutgång
char a = 'A';
a++;
System.out.println(a);
Den latinska bokstaven Bkommer att visas på skärmen.
Eftersom:
A65
B66
C67

Jobbar med chars

Varje charär först och främst ett nummer (teckenkod) och sedan ett tecken. Om du kan en teckenkod kan du alltid få tecknet i ditt program. Exempel:

Koda Konsolutgång
char c = (char) 1128;
System.out.println(c);

Ѩ

Standardkoder

Här är de mest kända teckenkoderna:

Tecken 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. booleantyp

Och den sista primitiva typen är boolean.

Som du redan vet kan det bara ta två värden: trueoch false.

Och med det vet du redan allt som finns att veta om den här typen.