"Eftersom utvecklare kunde komma med klasser som beskriver siffror, bestämde de sig för att vara kreativa, som riktiga utvecklare."

"Först kom de med en abstrakt nummerklass, från vilken Byte, Short, Integer, Long, Float och Double härleds. Den har metoder som hjälper till att konvertera tal till andra numeriska typer."

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

"Rätt. Du kan trots allt inte skriva det här:"

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

"Ja, dessa typer är inte primitiva. Det är därför vi använder metoderna i klassen Number:"

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

"Men det finns fortfarande ett par saker att tänka på. Eftersom Integer inte är en int, kan Integer-objekt inte jämföras med den klassiska «==»-operatorn."

Jämför primitiva typer
int x = 500;
int y = 500;
x == y; //true
Jämför icke-primitiva typer
Integer x = 500;
Integer y = 500;
x == y; //false
x.equals(y); //true

"Precis. På något sätt tänkte jag inte på det direkt."

"Men det finns mer."

"Du kortsluter mina kretsar! Vad finns det mer?"

"När vi tilldelar ett int-värde till en Integer-variabel kallas Integer.valueOf-metoden:"

Koda Vad händer egentligen
Integer x = 5;
Integer x = Integer.valueOf(5);

"Ja, jag förstod det redan från exemplet ovan."

"Men funktionen valueOf skapar inte alltid ett nytt heltalsobjekt."

"Äh, vad menar du med "inte alltid"?"

"Den cachelagrar värden från -128 till 127."

Koda Vad händer egentligen Beskrivning
Integer x = 300;
Integer y = 300;
Integer z = 300;
Integer x = Integer.valueOf(300);
Integer y = Integer.valueOf(300);
Integer z = Integer.valueOf(300);
Variabler x, y och z innehåller referenser till olika objekt
Integer x = 100;
Integer y = 100;
Integer z = 100;
Integer x = Integer.valueOf(100);
Integer y = Integer.valueOf(100);
Integer z = Integer.valueOf(100);
Variablerna x, y och z innehåller referenser till samma 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);
Variablerna z och t innehåller referenser till samma objekt.

"Med andra ord, situationen är denna:"

1)  Om vi ​​skriver «new Integer()», så får vi garanterat ett nytt objekt.

2)  Om vi ​​anropar Integer.valueOf(), explicit eller genom autoboxning, kan metoden returnera ett nytt objekt eller ett cachat objekt om numerisk argument är i intervallet från -128 till 127.

"Vad är det som är så hemskt med metoden som returnerar ett objekt från cachen?"

"Strunt i det. Du behöver bara veta att ibland, när du inte förväntar dig det, kan objekt vara lika. Allt med jämlikhet är komplicerat. Om vi ​​jämför en primitiv med en icke-primitiv, då jämförs de som primitiva:"

Jämförelseproblem
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)
Ett ännu mer intressant exempel. Cachen kommer in i bilden här
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 är inte inblandad här
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)

"Bra... Och hur ska jag memorera allt detta?"

"Du behöver inte memorera detta. Du behöver bara förstå hur allt detta är organiserat och vad som faktiskt händer när en primitiv och dess icke-primitiv motsvarighet kommer in i bilden."

"Jag rekommenderar också att du tittar på metoderna i klassen Integer. Den har en hel del bra och användbara metoder. Du har till och med använt en av dem ganska ofta."

"Ja, jag kommer ihåg. Integer.parseInt();"