"Siden utviklere kunne komme opp med klasser som beskriver tall, bestemte de seg for å være kreative, som ekte utviklere."

"Først kom de opp med en abstrakt tallklasse, som Byte, Short, Integer, Long, Float og Double er avledet fra. Den har metoder som hjelper til med å konvertere tall til andre numeriske typer."

Metoder for nummerklassen
1
int intValue()
2
long longValue()
3
float floatValue()
4
double doubleValue()
5
byte byteValue()
6
short shortValue()

"Riktig. Tross alt kan du ikke skrive dette:"

Long x = 100000;
Integer y = (Integer) x;

"Ja, disse typene er ikke primitive. Det er derfor vi bruker metodene til Number-klassen:"

Long x = 100000;
Integer y = x.intValue();

"Men det er fortsatt et par ting å vurdere. Fordi Integer ikke er en int, kan ikke Integer-objekter sammenlignes med den klassiske «==»-operatoren."

Sammenligning av primitive typer
int x = 500;
int y = 500;
x == y; //true
Sammenligning av ikke-primitive typer
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

"Akkurat. På en eller annen måte tenkte jeg ikke på det med en gang."

"Men det er mer."

"Du kortslutter kretsene mine! Hva mer er det?"

"Når vi tilordner en int-verdi til en Integer-variabel, kalles Integer.valueOf-metoden:"

Kode Hva skjer egentlig
Integer x = 5;
Integer x = Integer.valueOf(5);

"Ja, jeg forsto det allerede fra eksempelet ovenfor."

"Men valueOf-funksjonen lager ikke alltid et nytt heltallsobjekt."

"Øh, hva mener du med «ikke alltid»?"

"Den lagrer verdier fra -128 til 127."

Kode Hva skjer egentlig Beskrivelse
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Variable x, y og z inneholder referanser til forskjellige objekter
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Variablene x, y og z inneholder referanser til det samme objektet.
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = 10;
Integer t = 10;
Integer x = new Integer(10)
Integer y = new Integer(10)
Integer z = Integer.valueOf(10);
Integer t = Integer.valueOf(10);
Variablene z og t inneholder referanser til samme objekt.

"Med andre ord, situasjonen er denne:"

1)  Hvis vi skriver «new Integer()», så får vi garantert et nytt objekt.

2)  Hvis vi kaller Integer.valueOf(), eksplisitt eller gjennom autoboksing, kan metoden returnere et nytt objekt eller et bufret objekt hvis tallargumentet er i området fra -128 til 127.

"Hva er så forferdelig med metoden som returnerer et objekt fra hurtigbufferen?"

"Glem det. Du trenger bare å vite at noen ganger, når du ikke forventer det, kan objekter være like. Alt med likhet er komplisert. Hvis vi sammenligner en primitiv med en ikke-primitiv, så sammenlignes de som primitiver:"

Sammenligningsproblem
int x = 300;
Integer y = 300;
Integer z = 300;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references)
Et enda mer interessant eksempel. Cachen kommer inn i bildet her
int x = 100;
Integer y = 100;
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //true (comparison based on references; they point to the same object)
Men cachen er ikke involvert her
int x = 100;
Integer y = new Integer(100);
Integer z = 100;

x == y; //true (comparison based on primitive value)
x == z; //true (comparison based on primitive value)
y == z; //false (comparison based on references; they point to different objects)

"Flott... Og hvordan skal jeg lære alt dette utenat?"

"Du trenger ikke å lære dette utenat. Du trenger bare å forstå hvordan alt er organisert og hva som faktisk skjer når en primitiv og dens ikke-primitive motpart kommer inn i bildet."

"Jeg anbefaler også at du ser på metodene til Integer-klassen. Den har ganske mange gode og nyttige metoder. Du har til og med brukt en av dem ganske ofte."

"Ja, jeg husker. Integer.parseInt();"