Datastrukturer Datastrukturer Datatyper i Java Primitiva datatyper i

Datastrukturer
Datastrukturer
• En datastruktur beskriver den information som
datorn måste hålla reda på för att lösa en
uppgift
Vad är en datastruktur?
Vad är en datatyp?
Primitiva datatyper i Java
Icke-primitiva datatyper i Java
Minnesexempel med datastrukturer
Vektorer i Java
• 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
Erik Forslin
[email protected]
Rum 1445, plan 4 på Nada
08-7909690
• Måste vara strukturerad och lättläst
• Beskrivs med fördel med en minnesbild
1
2
Datatyper i Java
Primitiva 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;
• De primitiva datatyperna i Java beskriver enkla
saker vars värde kan lagras direkt i variabelns
minnesutrymme (”låda”)
int
x
• Java har åtta primitiva datatyper:
• 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
Heltal
Flyttal
Tecken
Logiska
byte
short
int
long
float
double
char
boolean
4
Heltal
Flyttal
• Det finns fyra heltalstyper i Java:
Datatyp
byte
short
int
long
• Det finns två flyttalstyper i Java:
Bitstorlek
Min-värde
Max-värde
Datatyp
Bitstorlek
Min-värde
Max-värde
8
16
32
64
−128
−32 768
−2 147 483 648
≈ −9 × 1018
127
32 767
2 147 483 647
≈ 9 × 1018
float
double
32
64
≈ −3.4 × 1038
≈ −1.7 × 10308
≈ 3.4 × 1038
≈ 1.7 × 10308
• Vid beräkningar kan dessa tal ”slå runt”. Exempel
med datatypen byte:
byte b = 127;
b = b + 1;
// b är nu -128 !
• 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 !
5
6
Logiska
Tecken
• Ett logiskt (booleskt) värde har datatypen boolean
• Ett tecken i Java har datatypen char
• En boolesk variabel kan endast anta värdena
true eller false
• 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
• 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
Minnesexempel med primitiva och
icke-primitiva datatyper
Icke-primitiva datatyper i Java
Källkoden
int
x
= 3;
double
y
= 3.14;
String
str
= "hejsan";
BufferedReader indata = new
BufferedReader(new
InputStreamReader(System.in));
• 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
ger vid exekvering upphov till följande datastrukturer
i minnet:
x
int
3
instans av
double
y 3.14
String
"hejsan" ?
? length()
String
instans av
str
• Den större datastrukturen är en instans av en
klass och ritas som en ”stor låda”
BufferedReader
BufferedReader
indata
?
readLine()
?
?
9
10
Hakvektor eller klassen Vector?
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
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
• I en instans av Vector kan man lägga till godtyckligt 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 Vector
Källkoden
Minnesexempel med hakvektor
// Skapa en instans av Vector
Vector betygen = new Vector();
// Lägg till en del betygsnamn
betygen.addElement("fyra");
betygen.addElement("trea");
betygen.addElement("femma");
Källkoden
// Skapa plats för åtta betyg
int[] betygen = new int[8];
// Ändra 0:e betyget till 2:a betyget
String tmpBetyg = (String)betygen.elementAt(2);
betygen.setElementAt(tmpBetyg, 0);
// Sätt en del betyg
betygen[2] = 4;
betygen[6] = 3;
ger följande minnesbild vid exekvering:
betygen[0] = betygen[2];
Vector
instans av
Vector
betygen
String
ger följande minnesbild vid exekvering:
0 1 2
tmpBetyg
?
?
size()
instans av
int[8]
int[]
betygen
4
4
3
instans av
0 1 2 3 4 5 6 7
? int
length 8
String
"fyra"
?
? ?
instans av
instans av
String
"trea"
? ?
13
String
"femma"
? ?
14