"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 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
"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."
int x = 500;
int y = 500;
x == y; //true
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 |
---|---|
|
|
"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 |
---|---|---|
|
|
Variabler x, y och z innehåller referenser till olika objekt |
|
|
Variablerna x, y och z innehåller referenser till samma objekt. |
|
|
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:"
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)
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)
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();"
GO TO FULL VERSION