Generelt
I java opererer vi med seks primitive talltyper med forskjellige egenskaper, som brukes forskjellig deretter. Det er 4 heltalls-typer og 2 flyttalls-typer. Forskjellen på disse innad er antall bit tallet representeres ved, og nøyaktighet av de. De mest brukte typene er int og double. Det er viktig å merke seg at tallene man opererer med i java ikke er ideelle matematiske tall, men er representert med et begrenset antall bit, noe som kan føre med seg uønskede egenskaper.
Type | Innhold | Default-verdi | Størrelse | Verdiområde |
---|---|---|---|---|
byte | Heltall | 0 | 8 | -128 til 127 |
short | Heltall | 0 | 16 | -32,768 til 32,767 |
int | Heltall | 0 | 32 | -2,147,483,648 til 2,147,483,647 |
long | Heltall | 0 | 64 | -9,223,372,036,854,775,808 til 9,223,372,036,854,775,807 |
float | Flyttall | 0.0 | 32 | +/- 1.4E-45 til +/- 3.4028235E+38 |
double | Flyttall | 0.0 | 64 | +/- 4.9E-324 til +/- 1.7976931348623157E+308 |
Heltall
Det vil sjeldent være noen noe grunn til å bruke noe annet enn int når man bruker heltall. Det vil i så fall være dersom man har bruk for virkelig store tall (se over), som kan løses med et long. Eller man har strenge krav til minnesparsommelighet og skal ha store mengder heltall i array uten å trenge hele verdiområdet til int. I så fall vil et short, eller byte være en mulighet.
Dersom vi vil konvertere mellom to heltall vil dette gå fint dersom tallet er innenfor verdiområdet til den nye typen.
Correct casting int i = 99; byte b = (byte) i; System.out.println(b); // 99 i er innenfor verdiområdet til byte |
Incorrect casting int i = 500; byte b = (byte) i; System.out.println(b); // -12 i er utenfor verdiområdet til byte
|
Higher #bits int i = Integer.MAX_VALUE; long l = i; System.out.println(l); // 2147483647 Trenger ikke caste "oppover" |
---|
Flyttall
Hva flyttall angår vil det vil sjeldent være grunn til å bruke noe annet enn double. Det som er viktig å bemerke seg er at et flyttall blir mindre og mindre nøyaktig desto større det blir og at man kan oppleve upresise beregninger selv på små verdier.
Double tar også tre "merkelige" verdier som er greit å vite om:
NaN: "Not a number", NaN kan tildeles en double dersom vi prøver å utføre operasjoner som ikke lar seg gjøre. Se under, eksempel 1.
Infinity: "Uendelig", Infinity er større enn alle tall, og følger noen enkle regler, eksempel 2.
-Infinity: "Negativ uendelig", -Infinity er mindre en alle tall, og følger de samme reglene som Infinity.
Eksempel 1 NaN-code double d1 = Math.sqrt(-1); // NaN double inf = Double.POSITIVE_INFINITY; double d2 = inf - inf; // NaN
| Eksempel 2 Infinity double pos_inf = Double.POSITIVE_INFINITY; // Infinity double neg_inf = Double.NEGATIVE_INFINITY; // -Infinity System.out.println(pos_inf - 10); // Infinity System.out.println(neg_inf - 10); // -Infinity System.out.println(pos_inf * -1); // -Infinity
|
---|
Wrapper-klassene
De primitive talltypene i java har alle en "wrapper"-klasse. Disse klassene pakker inn den primitive talltypen, og gjør det mulig å representere den som et objekt. Dette gjøres ofte av kompilatoren og kalles da "autoboxing".
I java finnes det en Number-klasse som subklasses av de forskjellige wrapper-klassene. Number-klassen er abstrakt med de abstrakte metodene byteValue(), shortValue() ... doubleValue() som subklassene implementerer for å kunne konvertere til spesifikke talltyper. Et number-objekt vil alltid være en instans av en av subklassene.
Bildet er hentet fra Oracles sider.
Heltalls-klassene har nyttige metoder og attributter og metoder som MAX_VALUE, MIN_VALUE, toString(), valueOf().
I tillegg implementerer alle tallklassene Comparable og dermed metoden compareTo(), slik at tall kan sorteres.
Man skal ikke bruke tallobjekter ukritisk og det er hovedsaklig tre tilfeller vi tar wrapperklassene til tall i bruk:
- når en må blande ulike talltyper eller talltyper og andre objekt-typer
- når en ønsker å bruke Collection-rammeverket sammen med tall (både Collection- og Map-subklasser)
- når en ønsker å skille mellom ikke-noe-tall (null) og en gyldig tall-verdi
Collections med tall
Når vi ønsker å lagre tall i et Collection-objekt må tallene være objekter, men java har mekanismer som i mange tilfeller gjør dette for oss.
Mer om hvorfor vi initialiserer collections med et klassenavn her.
Adding objekt List<Integer> list = ArrayList<Integer>(); list.add(Integer.valueOf(13)); // valueOf() refererer til et objekt list.get(0) // En Integer
| Som nevnt over har java mekanismer som konverterer for oss Auto-converting list.add(n) // oversettes til list.add(Integer.valueOf(n)) // og list.get(i) // oversettes til list.get(i).intValue()
|
---|