masjav
2018-07-20 15:47

czemu ?

Integer a = 100, b = 100, c = 200, d = 200;

System.out.println(c==d);//false?
System.out.println(a==b);//true?
Shalom

Bo Integer ma taki niby cache w sobie dla wartości -128 do 127, więc valueOf() dla małych wartości zwraca tego samego Integera. Nie należy na tym polegać i nie należy porównywać obiektów przez ==. Popatrz sobie na źródła klasy Integer, masz tam w środku klasę IntegerCache.

    /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */
Silv

Podoba mi się! I przykład @masjav, i wyjaśnienie @Shalom, i to, że to rozumiem. :)

furious programming

Już wiem dlaczego w Javie nie piszę się kalkulatorów.

Spine

spróbuj z intem bez opakowania ;)
@furious programming Po co kalkulatorowi porównywanie intów :P ? A operacje na liczbach pewnie realizuje się na jakimś dokładnym typie ułamkowym.

Spine

@furious programming: Shalom też, a mu tego nie wytykasz :P

furious programming

@Shalom wyjaśnił OP na czym rzecz polega – nie odniósł się do mojego komentarza, bo pisał wcześniej. ;)

vpiotr

@masjav: jeśli masz opory przed używaniem Integer.equals - bo np. nie wiesz czy nie będzie nullem albo nie pasuje Ci zapis a.equals(b) - możesz użyć Objects.equals. Zaleta? Działa z Integer(100), Integer(200), int, null:

Integer a = 100, b = 100, c = 200, d = 200;
int e = 100, f = 200;

System.out.println(Objects.equals(c, d)); // true
System.out.println(Objects.equals(a, b)); // true
System.out.println(Objects.equals(a, e)); // true
System.out.println(Objects.equals(c, f)); // true

https://ideone.com/MubR1v

somekind

Spójność zachowania rodem z PHP.

vpiotr

Niestety PHP ma też swoje wady, ale rzeczywiście fajny język. ;-)