Upload
hallvard
View
222
Download
0
Embed Size (px)
Citation preview
8/14/2019 wrapperklassene
1/27
1
Lringsml for forelesningen
Java-programmering Tall-klasser i Java
Andre wrapper-klasser
Eclipse bruk av scrapbookfor evaluering og utfrelse av
kodesnutter
8/14/2019 wrapperklassene
2/27
2
Tall i Java (1)
Java har sttte for en rekke typer tall,
hvorav de vanligste er int og double
I motsetning til ideelle matematiske tall, s
vil tall representert vha. 0 og 1 ha unskede
egenskaper
Heltall, f.eks. int, har et begrenset tallomrde (+-2 ^ 31) Desimaltall, f.eks. double, har begrenset tallomrde og
nyaktighet
8/14/2019 wrapperklassene
3/27
3
Tall i Java (2)
Nr en bruker tall, kan en velge mellomflere typer enn int og double, med ulike
begrensningerbyte, short, int og long er heltall med tallomrde begrensetav antall bit:byte bruker 8 bit, short 16, int 32 og long 64.
Det er sjelden grunn til bruke noe annet enn int, som dekker +-(2^31)
float og double er s
kalte flyttall, som gir mulighet for b
destrre tall og desimaltall. Nyaktigheten er imidlertid begrenset og
dess strre tallet er, dess mindre nyaktig blir det.Det er sjelden grunn til bruke noe annet enn double, nr ennsker utfre tekniske beregninger som krever desimaltall.
8/14/2019 wrapperklassene
4/27
4
Tall i Java (3)
Hva skjer nr en blander talltyper? f.eks. byte + int, float + double eller int + double
Merk at tall i koden er av typen int og at det finnes egen syntaks for andre tall.
Java konverterer automatisk til int eller double, slik at enikke mister tallomrde eller nyaktiget under beregningen.
byte + int blir til int + int
int + double og float + double blir til double + double
Hva skjer nr svaret
skal konverteres tilbake? Vi m tvinge frem en
konverting vha. casting, noe som kan gi feil resultat!
8/14/2019 wrapperklassene
5/27
5
Bit-representasjon av heltall
byte-typen bruker 1 byte = 8 bit 00000000 = 0, 00000001 = 1, 00000010 = 2, ...
01111111 = 127, 10000000 = -128 11111111 = -1, 11111110 = -2, 11111101 = -3, ...
short-typen bruker 2 byte = 16 bit 0000000000000000 = 0, 0000000000000001 = 1, ...
0111111111111111 = 2 ^ 15 1 = 32767 1000000000000000 = -(2 ^ 15) = -32768
1111111111111111 = -1, 1111111111111110 = -2, ...
int bruker 4 byte/32 bit og long 8 byte/64
bit
8/14/2019 wrapperklassene
6/27
6
Konvertering
Ved konvertering klippes de verste
bitene bort (int)256 = 100000000 => (byte)0
(int)255 = 011111111 => (byte)-1
Fordel: tall innenfor gyldig tallomrde ser like ut:
(int)-1 == (byte)-1
8/14/2019 wrapperklassene
7/27
7
Tall som verdier
Tall-typer som int og double er skalte
primitive typer
Det er stort sett dette vi har brukt s langt!
Primitive typer skiller seg fra referansetyper (som peker til
objekter)
ingen identitet, metoder eller felter for primitive typer bare en
verdi som variabelen inneholder
Begrensninger ved tall-typer Tall-typene har ingen supertype tilsvarende Object, slik at en alltid
m deklarere tall-variabler som en spesifikk talltype
Collection-objekter kan ikke inneholde vanlige tall, nettopp fordi
de ikke er objekter
int heltall = 3
double desimaltall = 3.14
8/14/2019 wrapperklassene
8/27
8
Tall som
objekter Java har egne objektvarianter av tall, tegn og logiske
verdier, slik at de kan tilordnes variabler av typen Object(og Object-tabeller) og hndteres av Collection-objekter
int har sin Integer-klasse, boolean sin Boolean-klasse, char sin Character-klasse, osv.
List er ikke lov, en m bruke List
En kan lage nye tall-objekter p essensielt tre mter: Integer intObjekt1 = new Integer(4); // new-operatoren
Integer intObjekt2 = Integer.valueOf(4); // statisk metode som tar int-parameter
Integer intObjekt3 = Integer.valueOf(4); // (overlagret) statisk metode som tarString-parameter
Et tall-objekt er skalt immutable, dvs. ikke mulig endre.Dermed er det ikke noe farlig dele referanser til tall-objekter.
Integer heltall =
Double desimaltall =
3
3.14
8/14/2019 wrapperklassene
9/27
9
Tall vs. tallobjekter
En int er verdientil attributtet
En Integer er eteget object, ogdet er referansen
til objektet som er attributtets verdi Hvorfor trenger en noen ganger
bruke Integer-attributter (og ikke int)?
#1: MinKlasse
int i = 3
#1: MinKlasse
Integer i
#2: Integer
3
8/14/2019 wrapperklassene
10/27
10
Tall-objekter og identitet
Like tall-objekter kan vre forskjellige objekter: new Integer(4) != new Integer(4) new Integer(4) != Integer.valueOf(4) Integer.valueOf(4) == Integer.valueOf(4)
Integer.valueOf(4) != Integer.valueOf(4) Integer.valueOf(12345) != Integer.valueOf(12345)
new Integer(i) lager alltid et nytt objekt Integer.valueOf(i) lager noen ganger et
nytt objekt og returnerer noen ganger et eksisterende et
Integer.valueOf(s) ser ut til lage et nytt objekt
Ikke regn med at to like tall er identiske eller omvendt!
Merk at String oppfrer seg p en lignende mte! f.eks. Hall + vard == Hallvard gir true
8/14/2019 wrapperklassene
11/27
11
Eclipse sin scrapbook-
mekanisme Sakset fra Hjelpesystemet til Eclipse:
The Java Development Toolkit (JDT) contributesa scrapbook facility that can be used toexperiment and evaluate Java code snippetsbefore building a complete Java program
En scrapbooker en jpage-fil, med tilhrendeEclipse-editor.
Snutter med Java-kode kan kjres ogenkeltuttrykk kan evalueres, uten mtte lage enklasse med en main-metode.
8/14/2019 wrapperklassene
12/27
12
Opprette en scrapbook
Hyreklikk pmappe/pakke, velg New->Other... og deretterScrapbook Page
8/14/2019 wrapperklassene
13/27
13
Evaluere kode i en scrapbook (1)
Velg kodesnutten og deretter
Evaluate-knappen
Resultatet legges inn bak snutten
8/14/2019 wrapperklassene
14/27
14
Evaluere kode i en scrapbook (2)
Velg kodesnutten og deretter
Inspect-knappen
Resultatet vises i et eget popup-vindu
8/14/2019 wrapperklassene
15/27
15
Utfre kode i en scrapbook
Velg kodesnutten og deretter
Execute-knappen
Resultatet vises implisitt i konsollet
8/14/2019 wrapperklassene
16/27
16
Number-klassen
Number-klassen er superklassen til alle de spesifikke tall-klassene (Byte, Short, Integer, Long, Float, Double)
Number (er en abstraktklasse som) spesifiserer
(abstrakte) metoderfor
konvertere til spesifikketalltyper: byteValue(), shortValue(), intValue(), longValue(), floatValue(), doubleValue()
Hver heltallsklasse har nyttige attributter og metoder Integer.toString(int) lager en String av en int, tilsvarende
Integer.valueOf(int).toString(), men uten lage et Integer-objekt
Integer.MIN_VALUE og Integer.MAX_VALUE er statiske attributtersom er satt til hhv. minste og strste mulige int-verdier
Alle tall-klassene (alts Number-subklasser)implementerer Comparable og dermed compareTo-metoden, slik at tall kan sorteres.
8/14/2019 wrapperklassene
17/27
17
Konvertering mellom
tall og tall-objekter (1)
For lagre tall i Collection-objekter (oggenerelt nr en trenger en Object ellerNumber-referanse), m tall gjres om til
tall-objekter // kan ikke alltid bruke int[]List list = ArrayList();list.add(Integer.valueOf(13));list.get(0) gir en Integer
Java 1.5 har sttte for automatiskkonvertering mellom tall-objekter ogtilsvarende talltype (bde frem og tilbake)
8/14/2019 wrapperklassene
18/27
18
Konvertering mellom
tall og tall-objekter (2)
Konvertering skjer automatisk nr
deklarasjonene gjr det helt tydelig hva
slags type vi har og forventer Nr intObjekt er deklarert som en Integer vil
intObjekt = 1 oversettes til intObjekt =
Integer.valueOf(1)
int n = intObjekt * 2 oversettes til
int n = intObject.intValue() * 2
Nr list er deklarert som List vil
list.add(n) oversettes til
list.add(Integer.valueOf(n)) og
list.get(i) oversettes til list.get(i).intValue()
8/14/2019 wrapperklassene
19/27
19
Konvertering mellom
tall og tall-objekter (3)
Kan en bruke List og unng
konverteringen?
-deklarasjoner gjelder kun for
subklasser av Object
Kan en bruke List,
nr en ikke vet spesifikt hva slags talltyper
en har?
Nei, konvertering skjer kun for spesifikke
tall-klasser, som Integer og Double.
8/14/2019 wrapperklassene
20/27
20
Ikke bruk tall-objekter ukritisk
Tall-objekter brukes i tre tilfeller nr en m blande ulike talltyper eller talltyper og andre objekt-typer
nr en nsker bruke Collection-rammeverket sammen med tall (bdeCollection- og Map-subklasser)
nr en nsker skille mellom ikke-noe-tall (null) og en gyldig tall-verdi
Automatisk konvertering (skalt autoboxing) haren kostnad
automatisk generert konverteringskode tar tid
tall-objekter tar ogs plass og tid opprette og kaste:
List talliste = new ArrayList();talliste.add(1); talliste.add(1);for (int i = 2; i < 100; i++) {
talliste.add(i, talliste.get(i-2) + talliste.get(i-1));}
8/14/2019 wrapperklassene
21/27
21
boolean/Boolean og char/Character
Objekt-motstykket til boolean er Boolean brukes typisk nr en skal lagre logiske verdier blant andre typer objekter
Siden en kun trenger to slike objekter, tilsvarende true og false, harBoolean to statiske attributter TRUE og FALSE
Boolean.TRUE == true og Boolean.valueOf(true) == Boolean.TRUE Boolean. FALSE == false og Boolean.valueOf(false) == Boolean.FALSE
Det meste av det som er sagt om konvertering mellom tallog tall-objekter, gjelder ogs for boolean/Boolean ogchar/Character
konvertering skjer automatisk nr deklarasjonene er der, f.eks. gittList bs = new ArrayList();bs.add(2 == 0) oversettes til bs.add(Boolean.valueOf(2 == 0))
if (Boolean.TRUE) { ... } oversettes tilif (Boolean.TRUE.booleanValue()) { ... }
List cs = new ArrayList();cs.add(#) oversettes til cs.add(Character.valueOf(#))
8/14/2019 wrapperklassene
22/27
22
Desimaltallsberegninger
Tre merkelige desimaltall NaN (not a number), resultatet av umulige
beregninger Math.sqrt(-1.0) returnerer NaN
Merk at NaN != NaN, f.eks. Math.sqrt(-1.0) != Math.sqrt(-1.0)
Alle operasjoner med NaN som operand gir NaN,
dvs. har du frst ftt NaN, s fr du aldri noe annet
Infinity (uendelig) og -Infinity (negativ uendelig)
1.0 / 0.0 gir Infinity, 1.0 / -0.0 gir Infinity
(1.0 / -0.0) + (1.0 / 0.0) gir NaN
8/14/2019 wrapperklassene
23/27
23
Desimaltallsberegninger
Unyaktigheter i tallrepresentasjonen
gjr at beregninger blir unyaktige, s
ikke bruk == ved sammenligning av
desimaltall, men sjekk om tallet er
innenfor et lite interval(d1 epsilon < d2) && (d2 < d1+epsilon)
hvor epsilon er et veldig lite tall,
jfr. assertEquals(double, double, double)
8/14/2019 wrapperklassene
24/27
24
Flere tallklasser
I tillegg til Integer, Double osv. som harmotstykkene int, double osv., s har Java totallklasser med ubegrenset tallomrde
java.math.BigInteger er heltall med ubegrenset strrelse java.math.BigDecimal er tilsvarende for flyttall
Begge er subklasser av java.lang.Number, som de andre tall-klassene
Disse klassene lar en jobbe med kjempestore tall(som kan ta mye plass og tid operere p)
Noen typer tallteoretiske og numeriskeanvendelser kan dra nytt av disse, f.eks. letingetter store primtall ifm. kryptering.
8/14/2019 wrapperklassene
25/27
25
BigInteger-eksempel
List tall = new ArrayList();tall.add(1);tall.add(1);for (int i = 2; i < 100; i++) {
tall.add(i, tall.get(i-2) + tall.get(i-1));}
Konverteres til:
List tall = newArrayList();tall.add(BigInteger.valueOf(1));tall.add(BigInteger.ONE);for (int i = 2; i < 100; i++) {
tall.add(i, tall.get(i-2).add(tall.get(i-1)));}
8/14/2019 wrapperklassene
26/27
26
String-objekter ligner p
tall-objekter Et String-objekt kan ikke endres, dvs. det finnes ingen endringsmetoder
String-objekter lages som regel implisitt, fra konstanter eller uttrykk
Sammenligning med == kan vre uforutsigbart, bruk equals
Ved ukritisk bruk kan en lage fryktelig mange String-objekter uten at en er
klar over det:BufferedReader reader = String result = "";while (reader.ready()) {
result = result + reader.readLine();}
Ved trinnvis bygging av String-objekter er det bedre bruke StringBuffer
(=1.5), f.eks. slik:BufferedReader reader = StringBuilder result = new StringBuilder();while (reader.ready()) {
result.append(reader.readLine());}
8/14/2019 wrapperklassene
27/27
27
Lringsml for forelesningen
Java-programmering Tall-klasser i Java
Andre wrapper-klasser
Eclipse bruk av scrapbookfor evaluering og utfrelse av
kodesnutter