Pytanie było mniej więcej takie:
Jaki będzie wynik wykonania następującego kodu?
Integer a = 100, b = 100, c = 200, d = 200, e = 300, f = new Integer(300); System.out.println((a==b)+" "+(c==d)+" "+(e==f));Proste, prawda? Nie, nie będzie to:
false false falselecz
true false false
Na pierwszy rzut oka można stwierdzić, że zadanie jest banalne, gdyż dla każdej zmiennej przypisana zostanie oddzielna instancja klasy Integer - nasza liczba zostanie opakowana. Szczerze mówiąc byłem trochę zaskoczony poprawną odpowiedzią, ale kilka minut w sieci dało odpowiedź na pytanie.
Java, obiekty typu Integer, Byte, Short lub Long o wartościach z przedziału -128 do 127, przechowuje w miejscu, gdzie te obiekty się nie powtarzają, dlatego dla tych wartości zawsze otrzymamy tę samą referencję. Aby otrzymać obiekty o różnych adresach należy użyć słowa kluczowego new.
Integer a = new Integer(100); Integer b = new Integer(100); System.out.println(a==b);
falseWięcej na ten temat można przeczytać tutaj.
2 komentarze:
Slyszalem o tym przy okazji opowiadania nt dlaczego Java sucks. Wg mnie jest to niestety niekonsystencja jezyka, ktora moze kogos kosztowac dosc dlugie godziny zastanawiania sie dlaczego cos nie dziala.
Java liczy już ponad 15 lat i o ile na początku istnienia tego języka podobne optymalizacje miały jakiekolwiek uzasadnienie, to w chwili obecnej, moim zdaniem, tylko zaśmiecają język.
Prześlij komentarz