2010-06-21 12 views
16

Wynik bieżącego programu to "Dziwny". Ale obie zmienne mają to samo odniesienie. Dlaczego drugie i trzecie porównanie nie jest prawdziwe?Porównanie zmiennych wskazujących na ten sam obiekt Integer

Integer a; 
Integer b; 
a = new Integer(2); 
b = a; 
if(b == a) { 
    System.out.println("Strange"); 
} 
a++; 
if(b == a) { 
    System.out.println("Stranger"); 
} 
a--; 
if(b == a) { 
    System.out.println("Strangest"); 
} 

wyjściowa: Strange

+0

Unboxing to prawdopodobnie odpowiedź. Jednak nie mam prawdziwego pomysłu. – jjnguy

+9

+1 za wykazanie niewybaczalnego użycia autoboxingu. –

Odpowiedz

19

To jest artefaktem autoboxing i fakt, że liczba całkowita jest niezmienna w Javie.

Na i a-- są tłumaczone z grubsza to.

int intA = a.getInt(); 
intA++; 
a = Integer.valueOf(intA); // this is a reference different from b 
+14

Zauważ, że jeśli zastąpisz 'a = new Integer (2)' z 'a = Integer.valueOf (2)', "Strangest" zostanie również wydrukowany, ponieważ użyje on pamięci podręcznej integer do pobrania instancji. –

+0

Co masz na myśli przez całkowitą pamięć podręczną w komentarzu. czy możesz rozwinąć ? – restrictedinfinity

+4

@restriefinfinity. Przynajmniej w Javie Java, Byte, Short i Integer mają pamięć podręczną zawierającą 256 wartości w zakresie od -128 do 127 włącznie, obsługiwanych przez metodę 'Type.valueOf()'. Tak więc w naszym przypadku po 'a -' wartość int wynosi '2' i to jest to samo, z czym zaczynaliśmy, więc' Integer.valueOf (2) 'zwróciłby ten sam obiekt' Integer'. Zauważ, że typ 'Long' nie ma pamięci podręcznej, dlatego' Long.valueOf' zawsze zwraca nowy obiekt. –

6
  • Strage - to oczywiste, że dwie zmienne wskazują na ten sam obiekt

  • nie Stranger powodu autoboxing. Integer jest niezmienny, więc każda operacja na nim tworzy nową instancję.

  • nie Strangest, ze względu na poprzedni punkt oraz z powodu użycia new Integer(..), która ignoruje pamięć podręczną używaną dla zakresu bajtów. Jeśli użyjesz początkowo Integer.valueOf(2), zostaną użyte buforowane Integer s i wydrukowane zostanie również Strangest.

Powiązane problemy