2012-02-17 9 views
8

Powiel możliwe:
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?java == dla Integer

Znalazłem następujące == zachowanie dla obiektów Integer i nie udało mi się go zrozumieć. (Zdaję sobie sprawę, że należy stosować równe dla takich porównań, ale uczę się na OCPJP ...)

W skrócie, == działa zgodnie z oczekiwaniami do 1000, ale nie do 10.

Były fragmentem kodu:

Integer i1 = 1000; 
Integer i2 = 1000; 
if(i1 != i2) System.out.println("different objects"); 
if(i1.equals(i2)) System.out.println("meaningfully equal"); 

i zachowuje się, jak można by oczekiwać, że:

different objects 
meaningfully equal 

Ten ostatni mimo:

Integer i3 = 10; 
Integer i4 = 10; 
if(i3 == i4) System.out.println("same object"); 
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

ma następujący wynik:

same object 
meaningfully equal 

Może ktoś proszę wyjaśnić, dlaczego tak się dzieje?

+1

BTW Spróbuj z '-XX: + AggressiveOpts' a pierwszy z nich będzie zachowywać się jak drugi, jak zwiększa rozmiar pamięci podręcznej Integer. ;) –

Odpowiedz

11

Od wersji Java 5 wprowadzono buforowanie klasy opakowania. Poniżej znajduje się przegląd pamięci podręcznej utworzonej przez wewnętrzną klasę IntegerCache, znajdującą się w pamięci podręcznej Integer. Na przykład, następujące kod utworzyć bufor:

Integer myNumber = 10 

lub

Integer myNumber = Integer.valueOf(10); 

256 obiektów całkowite tworzone są w zakresie od -128 do 127, które są przechowywane w tablicy całkowitą. Funkcję buforowania można zobaczyć, patrząc na klasę wewnętrzną IntegerCache, która znajduje się w liczbie całkowitej:

Tak więc podczas tworzenia obiektu za pomocą wartości Integer.valueOf lub bezpośredniego przypisywania wartości do liczby całkowitej w zakresie od -128 do 127 ten sam obiekt zostanie zwrócony. W związku z tym, należy rozważyć następujący przykład:

Integer i = 100; 
Integer p = 100; 
if (i == p) 
    System.out.println("i and p are the same."); 
if (i != p) 
    System.out.println("i and p are different."); 
if(i.equals(p)) 
    System.out.println("i and p contain the same value."); 

wyjście jest:

i and p are the same. 
i and p contain the same value. 

Ważne jest, aby pamiętać, że obiekt i oraz p zrównania tylko prawdziwe, ponieważ są one ten sam przedmiot, porównanie nie jest na podstawie wartości opiera się na równości obiektów. Jeśli liczba całkowita i oraz p znajdują się poza zakresem -128 lub 127, pamięć podręczna nie jest używana, dlatego tworzone są nowe obiekty. Podczas porównywania wartości zawsze używaj metody ".equals". Należy również zauważyć, że tworzenie instancji Integer nie tworzy tego buforowania.

Pamiętaj, że „==” jest zawsze używany do równości obiektu, nie został przeciążony do porównywania wartości odpakowanych

Powiązane problemy