Java zagadka

sobota, 28 maja 2011
Podczas tegorocznych Inżynierskich Targów Pracy jedna z firm przygotowała dla odwiedzających test wiedzy o języku Java. Do rozwiązania było 10 zadań, w tym 8 testowych i 2 otwarte. Jedno z pytań było bardzo ciekawe.








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 false
lecz
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);
false
Więcej na ten temat można przeczytać tutaj.

2 komentarze:

SiMet pisze...

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.

Unknown pisze...

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