Java: 126 == 126, 127 == 127, 128 != 128

Permalänk
Medlem

Java: 126 == 126, 127 == 127, 128 != 128

Hej, har en fråga om Java.

public class test { public static void main(String[] args){ Integer i = 127; Integer j = 127; if (i == j){ System.out.println("if"); } else{ System.out.println("else"); } } }

När i och j är samma tal och under 128 så är de lika när man jämför dem men när de är över 127 så är de olika, varför är det såhär?

Visa signatur

ASRock p67 extreme 4 | OCZ 240gb SSD + 320GB WDC + 1TB WDC GP | Intel Core i7 2600k | Nvidia Geforce GTX970 | 16gb Crucial Ballistix | Antec HC pro 1200w | Fractal define R2

Permalänk
Medlem
Skrivet av Lofman:

När i och j är samma tal och under 128 så är de lika när man jämför dem men när de är över 127 så är de olika, varför är det såhär?

Du jämför Integer-objekt; och vad du jämför då är egentligen deras adresser i minnet. Att det funkar för vissa tal är ren och skär tur. För att jämföra de tal objekten representerar måste du använda deras instansmetod compareTo.

Permalänk
Medlem

Eller skriv så här:

if (i.intValue() == j.intValue()){

Visa signatur

🖥 CPU:Intel Xeon E5-1650v2 @ 3.5 GHz GPU: MSI GeForce GTX 1060 3GB Minne:24 GB DDR3 ECC SSD: Samsung 840 EVO 500 GB 🖥️ Samsung UE55JU7005TXXE 4K 55"
🎮 Xbox Series X

Permalänk
Medlem

Ja men saken är den att det är en uppgift i kursen jag går.
127==127 kommer alltid att stämma, annars kan de ju inte ha det som uppgift :S

urklipp ur uppgiften:

Integer j1 = 127; //Bizarre Integer j2 = 127; // j1 == j2 ?

där kommentaren räknas som en fråga om det är sant eller falskt.
meningen är även att man ska kunna förklara varför det är som man säger.

En kompis hittade denna förklaringen nyss, stämmer det?

Citat:

For values between the range of -128 to 127 Java points all the Integer/ int references to the same object to save memory. Hence Integer.equals(int) returns true.

Visa signatur

ASRock p67 extreme 4 | OCZ 240gb SSD + 320GB WDC + 1TB WDC GP | Intel Core i7 2600k | Nvidia Geforce GTX970 | 16gb Crucial Ballistix | Antec HC pro 1200w | Fractal define R2

Permalänk

Haha, det är faktiskt ganska kul. Det din kompis säger stämmer.

Det som händer i bakgrunden är att om du säger att du vill ha en int som är mellan -128 till 127 hämtas talet bara från cachen. Därför får du exakt samma objekt när du skriver där imellan och får därmed samma referens till objektet. Du gör alltså aldrig en jämförelse av talet utan bara av referensen.

Om talet inte ligger inom spannet får du bara ett nytt objekt vilket gör att referensen inte stämmer. Såhär ser källkoden för detta ut:

/** * Returns a <tt>Integer</tt> instance representing the specified * <tt>int</tt> value. * If a new <tt>Integer</tt> instance is not required, this method * should generally be used in preference to the constructor * {@link #Integer(int)}, as this method is likely to yield * significantly better space and time performance by caching * frequently requested values. * * @param i an <code>int</code> value. * @return a <tt>Integer</tt> instance representing <tt>i</tt>. * @since 1.5 */ public static Integer valueOf(int i) { if(i >= -128 && i <= IntegerCache.high) return IntegerCache.cache[i + 128]; else return new Integer(i); }

Kika på denna tråd på SO:
http://stackoverflow.com/questions/1995113/strangest-language...

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem

Å tack!
Den där koden gav rejält med info, nu tror jag iallafall att jag kan redovisa varför det är som det är. ;D

Visa signatur

ASRock p67 extreme 4 | OCZ 240gb SSD + 320GB WDC + 1TB WDC GP | Intel Core i7 2600k | Nvidia Geforce GTX970 | 16gb Crucial Ballistix | Antec HC pro 1200w | Fractal define R2

Permalänk
Skrivet av Lofman:

Å tack!
Den där koden gav rejält med info, nu tror jag iallafall att jag kan redovisa varför det är som det är. ;D

Np. IntegerCache.High defaultar till 127 men jag har för mig att du kan höja den om du vill cacha mer

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase