sobota, września 26, 2020

Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)

Tak się bawię nowym IntelliJ i jak używa się var to próbuje podpowiedzieć jaki będzie wywnioskowany typ.

Działa to różnie:


Ogólnie zasada chyba jest taka, że parser Java'y w IJ potrafi wywnioskować typ na podstawie zwracanego typu (to ma przy metodach) i czasem jak przypisanie jest z prostej deklaracji z typem.
Nie jest więc tak wszechstronny jak kompilator Java'y, ale kompilator wie więcej.

Ale ja nie o tym tutaj ;-)

Bawiąc się tym zauważyłem, że konstruktor dla Integer jest deprecated, sprawdziłem i to prawda od wersji 9.
I tak się zacząłem tym bawić i okazuje się, że przez ostatnie ~16 lat żyłem w błędnym przekonaniu....

Zawsze pamiętałem, że JVM ma optymalizację by nie przeginać z ilością Integer'ów, i że np. dla 1 jest dokładnie 1 obiekt w pamięci, a wszystkie zmienne które trzymają Integer'a o wartości 1 mają referencję do tego jednego jedynego.... i że JVM od Oracle'a ma to dla liczb od -128 do 127 (choć teraz jak to widzę to jest konfigurowane).

I zawsze tu zakładałem, że JVM ogarnia jakoś wołanie new Integer(x), czy może bardziej kompilator jak się zastanowić...

No i byłem przekonany, że:

wypisze true...

A tu "dupa", nie, wypisze false, bo new stworzy dwa całkiem nowe obiekty. Żeby cache zadziałał trzeba użyć Integer.valueOf....

Fakt, sam używam "od zawsze" Integer.valueOf(int), ale przyznam, że coś mi się porobiło w głowie jak do mnie dotarło jak błądziłem.

Choć niech mnie tłumaczy, że jak mi się zdarza pracować z Integer to właśnie przez Integer.valueOf, albo przez autoboxing, a:
Zadziała tak, że wypisze true.

Jak na to spojrzeć to to ma pełen sens, bo skąd biedna JVM ma wiedzieć, że nowo tworzony obiekt Integer wskazuje na już istniejący? Albo kompilator by musiał generować tu specjalny kod do obsługi tego dla new, albo sama JVM w momencie "zobaczenia wołania" w stylu:

musiałaby nie wołać konstruktora, ale zaglądać do cache.... i jak sprawdziłem nawet Java 8 nie robiła takich cudów :-)




Podobne postybeta
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Ile to jest 1+1 w Java'ie?
Magia w Java'ie ;-)
Chorowanie jest do bani, czyli wspomnienia z L4... które trwa ;-)
Zmienne Go ;-)

Brak komentarzy:

Publikowanie komentarza