Datastrukturer Vad är en datastruktur? Vad är en datatyp? Primitiva datatyper i Java Icke-primitiva datatyper i Java Minnesexempel med datastrukturer Vektorer i Java Erik Forslin efo@nada.kth.se Rum 1445, plan 4 på Nada 08-7909690 1
Datastrukturer En datastruktur beskriver den information som datorn måste hålla reda på för att lösa en uppgift Kan identifieras genom de substantiv som finns i problemställningen eller uppgiftslydelsen Måste innehålla väl beskrivande namn på identifierare. Utnyttja singular- och pluralformer Måste vara strukturerad och lättläst Beskrivs med fördel med en minnesbild 2
Datatyper i Java En datatyp är något som bestämmer vilken slags data en variabel kan innehålla (t ex heltal, decimaltal, tecken, referens) Datatypen bestäms vid deklarationen av en variabel. Exempel: int x; int x En variabel kan bara innehålla den typ av data som den är deklarerad för Java har två varianter av datatyper: primitiv datatyp och icke-primitiv datatyp (referens till en instans) 3
Primitiva datatyper i Java De primitiva datatyperna i Java beskriver enkla saker vars värde kan lagras direkt i variabelns minnesutrymme ( låda ) Java har åtta primitiva datatyper: Heltal Flyttal Tecken Logiska byte float char boolean short double int long 4
Heltal Det finns fyra heltalstyper i Java: Datatyp Bitstorlek Min-värde Max-värde byte 8 128 127 short 16 32 768 32 767 int 32 2 147 483 648 2 147 483 647 long 64 9 10 18 9 10 18 Vid beräkningar kan dessa tal slå runt. Exempel med datatypen byte: byte b = 127; b = b + 1; // b är nu -128! 5
Flyttal Det finns två flyttalstyper i Java: Datatyp Bitstorlek Min-värde Max-värde float 32 3.4 10 38 3.4 10 38 double 64 1.7 10 308 1.7 10 308 Vid beräkningar kan dessa tal även anta värdena ±Infinity och NaN ( Not a Number ): double d = 1.0 / 0.0; // d är nu Infinity! d = 0.0 / 0.0; // d är nu NaN! 6
Tecken Ett tecken i Java har datatypen char Java använder teckenkodningssystemet Unicode som har stöd för nästan alla språk En teckenlitteral skrivs med omgivande apostrofer, t ex char tkn = 'a'; tkn = '&'; tkn = ' ''; // apostrof måste skyddas med ' ' 7
Logiska Ett logiskt (booleskt) värde har datatypen boolean En boolesk variabel kan endast anta värdena true eller false Booleska variabler används ofta som villkor i val eller slingor: boolean spelavidare = true; while (spelavidare) /* Källkod för t ex ett spel. Värdet på variabeln "spelavidare" ändras om spelet av någon anledning inte ska fortsätta. */ } 8
Icke-primitiva datatyper i Java En icke-primitiv datatyp används för att hålla reda på större datastrukturer än primitiva data En variabel av en icke-primitiv datatyp kallas ofta referensvariabel eftersom den innehåller en referens Referensvariabeln refererar till den del av minnet som innehåller den större datastrukturen Den större datastrukturen är en instans av en klass och ritas som en stor låda 9
Minnesexempel med primitiva och icke-primitiva datatyper Källkoden int x = 3; double y = 3.14; String str = "hejsan"; BufferedReader indata = new BufferedReader(new InputStreamReader(System.in)); ger vid exekvering upphov till följande datastrukturer i minnet: int x 3 double y 3.14 String str BufferedReader indata instans av String "hejsan"? length()? instans av BufferedReader? readline()?? 10
Vektorer Vektorer används för att samla en mängd saker, element, i en och samma datastruktur Java har inbyggda vektorer och en klass Vector som kan användas De inbyggda vektorerna kännetecknas av att man använder [ och ] (hakparenteser). En del kallar dessa för hakvektorer eller arrayer (från engelskans array ) Elementen i en vektor är numrerade från 0 och uppåt. Ett elements ordningsnummer kallas index Ofta används slingor i kombination med vektorer 11
Hakvektor eller klassen Vector? Vid val mellan att använda hakvektorer eller klassen Vector bör man tänka på följande: Antalet element i hakvektorer bestäms när hakvektorn skapas (instansieras) och kan sedan inte ändras kan man lägga till god- I en instans av Vector tyckligt många element I en hakvektor kan bara element av samma datatyp lagras I en instans av Vector kan endast referenser lagras. Primitiva datatyper kan inte lagras utan att de bakas in i en större datastruktur som man kan referera till ( Wrapper -klasser) 12
Minnesexempel med hakvektor Källkoden // Skapa plats för åtta betyg int[] betygen = new int[8]; // Sätt en del betyg betygen[2] = 4; betygen[6] = 3; betygen[0] = betygen[2]; ger följande minnesbild vid exekvering: int[] betygen instans av int[8] 4 4 3 0 1 2 3 4 5 6 7? int? length 8 13
Källkoden Minnesexempel med Vector // Skapa en instans av Vector Vector betygen = new Vector(); // Lägg till en del betygsnamn betygen.addelement("fyra"); betygen.addelement("trea"); betygen.addelement("femma"); // Ändra 0:e betyget till 2:a betyget String tmpbetyg = (String)betygen.elementAt(2); betygen.setelementat(tmpbetyg, 0); ger följande minnesbild vid exekvering: Vector betygen String tmpbetyg instans av Vector 0 1 2? size()? instans av String "fyra"?? String "trea"?? instans av instans av String "femma"?? 14