2012-10-13 14 views
9

może Każdy organ wyjaśni mi, co się dzieje w danych wyjściowych. Jeśli == jest używane do porównania dwóch wartości zadanych. zmienna po prostu sprawdza swoje odwołanie, jeśli są one takie same, jak wprowadzono, jeśli ciało, to dlaczego to, do cholery, jest równe, jeśli cretowanie statycznej metody valueOf() i ee == ff nie jest równe (co jest ok), jeśli tworzenie jego obiekt za pomocą nowego słowa kluczowego?operator == zachowanie różnicy na obiekcie klasy opakowującej

static void main(String args[]) 
{ 
    Integer aa = Integer.valueOf("12"); 
    Integer bb = Integer.valueOf("12"); 
    if(aa==bb)System.out.println("aa==bb"); 
    if(aa!=bb)System.out.println("aa!=bb"); 
    Integer ee = new Integer("12"); 
    Integer ff = new Integer("12"); 


    if(ee==ff)System.out.println("ee==ff"); 
    if(ee!=ff)System.out.println("ee!=ff"); 
} 

wyjściowa:

aa == bb

ee = ff

+0

Interesujący artykuł, w którym opisano Twój problem: http://tech.puredanger.com/2007/02/01/valueof/ –

Odpowiedz

11

W == kontrole porównawcze dla równości obiekt!

Od Integer.valueOf utrzymuje cache Integer Przedmioty o wartości -128 do 127 valueOf(String) powraca w pamięci podręcznej obiektów, stąd == wyniki comparance w prawdziwe.

Integer a1 = new Integer("12"); 
Integer b1 = new Integer("12"); 
//a1 == b1 returns false because they point to two different Integer objects 

Integer aa = Integer.valueOf("12"); 
Integer bb = Integer.valueOf("12"); 
//aa == bb returns true because they point to same cached object 

Dla comparance wartości obiektów zawsze użyć metody .equals, dla prymitywów takich jak int, długi itp można użyć == porównawczy.

+0

Doskonała odpowiedź. nie wiedziałem o rzeczy z pamięci podręcznej. sprawdzane za pomocą 127 i 128, aby uzyskać różne wyniki. –

+2

W twojej odpowiedzi "// a == b jest prawdziwe" nie jest fałszywe, ponieważ dopóki nie utworzymy łańcucha za pomocą nowej metody String(), łańcuchy o tej samej wartości wskazują na ten sam obiekt typu String. Możesz uruchomić i sprawdzić raz. –

+0

@Ivar, a następnie lepiej podać przykład dla Integer, dlaczego dajesz błędną odpowiedź ludziom ?. Ponieważ ta odpowiedź ma najwyższy punkt widzenia, ludzie uznają, że to prawda, ale w rzeczywistości stwierdzenie (// a == b jest fałszywe) jest błędne. Czy chcesz, żebym wkleił zrzut ekranu ?. Zobacz, nie sugeruję zmian, ale lepiej zmień odpowiedź. Nie wiem, jak ludzie po prostu pobierali odpowiedź, nie czytając kompletnej odpowiedzi i nie sprawdzając, czy jest poprawna, czy nie. A jeśli zmienię kod, muszę zmienić całą odpowiedź. To tak, jakby usunąć kompletny kod. –

3

Ponieważ Integer.valueOf podtrzymuje pamięć liczb całkowitych od -128 do 127

Oto kod źródłowy valueOf można wyraźnie zobaczyć, że wraca do tego samego obiektu, jeśli wartość całkowita wynosi -128 do 127

public static Integer valueOf(int i) { 
    if(i >= -128 && i <= IntegerCache.high) 
     return IntegerCache.cache[i + 128]; 
    else 
     return new Integer(i); 
} 

tak Twój == zwraca wartość true. Jeśli wartość jest większa niż ta, to zawsze zwróci false.

Integer aa = Integer.valueOf("1200"); 
    Integer bb = Integer.valueOf("1200"); 
    aa == bb --> false 

Zawsze należy sprawdzić równość użyciu equals metodę

ee.equals(ff); 

Jeśli dodać inny jeśli się poniżej

if (ee.equals(ff)) 
     System.out.println("ee equals ff"); 

wyjściowa będzie

ee equals ff 
1

Dla ee i ff dwa przedmioty z Integer są tworzone na stercie, dlatego oba z nich odwołują się do różnych obiektów, więc nie są równe podczas korzystania z operatora ==.

1

new Integer("12") tworzy nowy obiekt Integer o wartości 12. Niezależnie od tego, ile razy robisz, za każdym razem tworzysz zupełnie nowy obiekt. Dlatego == nie działa w drugim przypadku.

JVM przechowuje pamięć podręczną obiektów Integer dla wartości, które są uważane za częściej używane (-128 - 127). Integer.valueOf("12") za sceną robi to samo (new Integer("12")), ale zanim to zrobi, sprawdza w tej pamięci podręcznej, czy dla tej wartości obiekt już istnieje w pamięci podręcznej, jeśli tak to właśnie to zwraca, w przeciwnym razie tworzy nowy, dodaje do pamięci podręcznej i zwraca ją. Dlatego == działa w pierwszym przypadku.

Ponadto, dla obiektów, == nie powinno być nigdy używane do sprawdzania równości, zamiast tego powinny być używane tylko do sprawdzania tożsamości (np. Do sprawdzenia, czy dwie różne zmienne odnoszą się do tego samego obiektu). Do sprawdzania równości zawsze używaj metody equals.

+0

Interesujące. Nie znałem pamięci podręcznej ... dzięki :) –

+0

Nie ma za co. :) –

Powiązane problemy