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 true och false ) |
char |
2 | 0 ... 65,535 | '\u0000' |
Tecken, 2 byte, alla större än 0 |
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
, int
och long
. De skiljer sig åt i sin storlek och utbudet av värden de kan lagra.
int
typ
Den vanligaste är int
typen. Namnet kommer från ordet int eger (heltal). Alla heltalsliteraler (heltal) i koden är ints
(om de inte slutar på , , L
eller F
) D
.
Variabler av denna typ kan ta värden från -2,147,483,648
till +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 |
---|---|
|
Metoden length() returnerar längden på en sträng |
|
Fältet length innehåller längden på arrayen. |
short
typ
Typen short
har fått sitt namn från short int
. Det kallas också ofta för ett kort heltal . Till skillnad från int
typen är dess längd bara två byte och intervallet för möjliga värden är från -32,768
till +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 int
eller short
har betydelse.
long
typ
Denna typ har fått sitt namn från long int
och kallas även ett långt heltal . Till skillnad från int
typen 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 int
standard heltalstyp och att använda long
typen endast när det verkligen var nödvändigt.
byte
typ
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 byte
typen: från -128
till +127
. Men det är inte dess styrka. Typen byte
används oftast när du behöver lagra en stor blobdata i minnet. En uppsättning byte
s ä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 byte
array ä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).
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 thousandths
som 1.000.000,153
. Men i USA, där Javas skapare bodde, antogs en annan standard:1000000.153
Java har två primitiva flyttalstyper: double
och 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.321
representeras 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*106
987654321
6
float
typ
Namnet på float
typen 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*1038
3.4*1038
Detta tillvägagångssätt gör det möjligt att lagra mycket större tal än en , int
samtidigt 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 |
---|---|
|
123.45679 |
|
12346.0 |
|
-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 float
typen inte är särskilt populär bland Java-programmerare.
double
typ
Typen double
är den vanliga flyttalstypen. Namnet kommer från dubbla precisionsflyttal . Alla riktiga bokstaver är double
s 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*10308
1.7*10308
Detta gör att 15-17 signifikanta siffror kan lagras.
Exempel:
Koda | Värde |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Denna precision, särskilt i jämförelse med float
typen, är avgörande: 99% av alla operationer med reella tal utförs med hjälp av typen double
.
11
bitar tilldelas för exponenten, vilket innebär att du kan lagra tiopotenser från -323
till +308
(det är en potens av två från -1024
till +1023
). Typen double
kan enkelt lagra ett tal med hundratals nollor efter decimalkomma:
Koda | Värde |
---|---|
|
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 |
---|---|
|
|
|
|
|
|
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 |
---|---|
|
|
|
|
|
|
Alla operationer med NaN
avkastning NaN
.
5. char
typ
Bland Javas primitiva typer förtjänar en särskild uppmärksamhet: char
typen. 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 char
typen också är en numerisk typ ! Det är en typ med två syften, så att säga.
Verkligheten är att char
typen faktiskt inte karaktärer. Istället lagrar den teckenkoder från Unicode-kodningen. Varje tecken motsvarar ett nummer: tecknets numeriska kod.
Varje char
variabel upptar två byte i minnet (samma som short
typen). Men till skillnad från short
typen char
är heltalstypen osignerad och kan lagra värden från 0
till 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:
Det finns olika sätt att tilldela ett värde till en char
variabel.
Koda | Beskrivning |
---|---|
|
Variabeln a kommer att innehålla den latinska bokstaven A . |
|
Variabeln a kommer att innehålla den latinska bokstaven A . Dess kod är 65 . |
|
Variabeln a kommer att innehålla den latinska bokstaven A . Dess kod är 65 , vilket är lika 41 i det hexadecimala systemet. |
|
Variabeln a kommer att innehålla den latinska bokstaven A . Dess kod är 65 , vilket är lika 41 i det hexadecimala systemet. De två extra nollorna ändrar ingenting. |
|
Variabeln a kommer 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, char
typen är också en heltalstyp, så du kan skriva något så här:
Koda | Konsolutgång |
---|---|
|
Den latinska bokstaven B kommer att visas på skärmen. Eftersom: A – 65 B – 66 C –67 |
Jobbar med char
s
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 |
---|---|
|
|
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. boolean
typ
Och den sista primitiva typen är boolean
.
Som du redan vet kan det bara ta två värden: true
och false
.
Och med det vet du redan allt som finns att veta om den här typen.