impossible code

0

Gdy dany mam warunek

if (a==b){
        System.out.println(a+"=="+b);
}else {
        System.out.println(a+"!="+b);
}

Program nie powinien nigdy wyświetlić np. 1!=1.
Problem jest taki że ten warunek wyświetla takie dane.
Jak to naprawić.

ps. To nie jest aplikacja wielowątkowa.

0

jakiego typu są zmienne 'a' i 'b'?

0

'a' i 'b' są typu String.
Są generowane losowo jako int, a potem zamieniane na String metodą:Integer.toString(int);

0

no to porownoj
a.equals(b);

porównuj*

0

No teraz działa, dzięki.
Ale czy metoda equals() w klasie String nie używa właśnie warunku if (a==b){}?

0

Ta.. ale jeśli nie, to porównuje char po charze czy są takie same...
equals() zwykle porównuje czy dwa obiekty są takie same, a nie czy są tym samym... (ofc do własnym obiektów powinieneś sam implementować metody equals, jeśli chcesz je porównywać)

W pamięci możesz mieć dwa obiekty String o tej samej wartości - są takie same, ale nie są tym samym, więc porównywanie referencji (==) nie ma tu sensu.

0

No rzeczywiście. Porównywałem referencje nie obiekty [glowa]

0

Dodam jeszcze, że kompilator może umieścić dwie różne zmienne typu String w tym samym miejscu pamięci i wtedy operator == zwróci poprawny wynik.

public class A
{
    public static void main(String[] args)
    {
        String s1="Baba Jaga";
        String s2="Baba "+"Jaga";
        String s3="Baba ";
        s3+="Jaga";
        System.out.println("s1 = s2 "+(s1==s2));  //true
        System.out.println("s1 = s3 "+(s1==s3));  //false
    }
}
0

Nie chcę się specjalnie czepiać, ale warto uściślić że to co napisał Bogdans odnosi się do stałych (tudzież literałów) typu String. Jest to efekt połączenia dwóch optymalizacji. Pierwszej polegającej na zwijaniu stałych oraz drugiej polegającej na zwijaniu stałych obiektów typu String.
W przykładzie powyżej kompilator zwija stałe podczas kompilacji, co daje mu dwie stałe o wartości "Baba Jaga", a następnie redukuje ich wszystkie wystąpienia do jednego (dzięki temu, że String jest niezmienne i wbudowane). Z s3 ta sztuczka nie może się udać ponieważ operacja += wykonuje się podczas wykonania programu, a nie kompilacji.

Krótko mówiąc referencje s1 i s2 są różnymi zmiennymi, ale odnoszą się do tego samego obiektu stałego "Baba Jaga".

Dzięki tej właściwości Javy jeżeli porównujemy zmienną String ze stałą, to można bezpiecznie użyć "==", zamiast equals (dlatego takie operacje występują w kodzie bibliotek Javy). Tyle, że trzeba mieć absolutną pewność, że jednym z operandów jest stała.

1 użytkowników online, w tym zalogowanych: 0, gości: 1