"Da udviklere kunne finde på klasser, der beskriver tal, besluttede de at være kreative, ligesom rigtige udviklere."

"Først kom de med en abstrakt talklasse, hvorfra Byte, Short, Integer, Long, Float og Double er afledt. Den har metoder, der hjælper med at konvertere tal til andre numeriske typer."

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

"Godt. Du kan jo ikke skrive dette:"

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

"Ja, disse typer er ikke primitiver. Det er derfor, vi bruger metoderne i klassen Number:"

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

"Men der er stadig et par ting at overveje. Fordi Integer ikke er en int, kan Integer-objekter ikke sammenlignes med den klassiske «==»-operator."

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

"Nøjagtig. På en eller anden måde tænkte jeg ikke på det med det samme."

"Men der er mere."

"Du kortslutter mine kredsløb! Hvad er der ellers?"

"Når vi tildeler en int-værdi til en Integer-variabel, kaldes Integer.valueOf-metoden:"

Kode Hvad sker der virkelig
Integer x = 5;
Integer x = Integer.valueOf(5);

"Ja, det forstod jeg allerede fra eksemplet ovenfor."

"Men funktionen valueOf opretter ikke altid et nyt heltalsobjekt."

"Øh, hvad mener du med "ikke altid"?"

"Den gemmer værdier fra -128 til 127."

Kode Hvad sker der virkelig 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 indeholder referencer til forskellige 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);
Variabler x, y og z indeholder referencer til det samme objekt.
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);
Variabler z og t indeholder referencer til det samme objekt.

"Med andre ord, situationen er denne:"

1)  Hvis vi skriver «nyt heltal()», så får vi med garanti et nyt objekt.

2)  Hvis vi kalder Integer.valueOf(), eksplicit eller gennem autoboxing, kan metoden returnere et nyt objekt eller et cachelagret objekt, hvis talargumentet er i området fra -128 til 127.

"Hvad er så forfærdeligt ved metoden, der returnerer et objekt fra cachen?"

"Lige meget om det. Du skal bare vide, at nogle gange, når du ikke forventer det, kan objekter være ligeværdige. Alt med lighed er kompliceret. 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 endnu mere interessant eksempel. Cachen kommer ind i billedet 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 involveret 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)

"Fantastisk... Og hvordan skal jeg lære alt dette udenad?"

"Du behøver ikke at huske dette. Du skal bare forstå, hvordan det hele er organiseret, og hvad der rent faktisk sker, når en primitiv og dens ikke-primitive modstykke kommer i spil."

"Jeg anbefaler også, at du ser på Integer-klassens metoder. Den har en del gode og brugbare metoder. Du har endda brugt en af ​​dem ret ofte."

"Ja, det kan jeg huske. Integer.parseInt();"