Moje projekty / OpenOffice.org2GoogleDocs / Bloggeroid / Gadacz / Chrome2Chrome / Kontakt ze mną   

środa, kwietnia 09, 2025

Nie mieszaj wrapperów z prymitywami ;-)

Dawno nie było niczego o Java'ie, bo mało piszę zawodowo (bycie managerem powoduje, że koduję głównie w Pythonie skrypty i sobie po godzinach robię zadania na LeetCode (do dziś mam nieprzerwany ciąg 191 dni i liczę, że nie przerwę...).

Wszyscy wiedzą, że w Java'ie w razie używania autoboxingu i ogólnie Integera wszystkie liczby od -128 do 127 są mapowane do trzymanych w cache instancji, w sensie, że każde użycie Integer.valueOf(1) zwróci zawsze tą samą instancję.

Stąd kod:

Integer x = 127;
Integer y = 127;
System.out.println(y==x);

Wypisz true, a standardowo kod:

Integer x = 128;
Integer y = 128;
System.out.println(y==x);

Wypisze false.

Ale jak się ten kod uruchomi z parametrem '-Djava.lang.Integer.IntegerCache.high=1000 to już wypisze true ;-)

Co ciekawe można podnieść ten górny zakres cache, ale nie da się zmienić tego dolnego :-)
Drugie co ciekawe jest takie, że jak się ustawi to high na wartość mniejszą niż 127 to i tak liczby od -128 do 127 będą zcachowane ;-)

Oczywiście najlepiej pisząc kod w Java'ie nie mieszać tak swobodnie wrapperów jak Integer z prymitywami. Bo to zawsze może zaboleć.



Podobne postybeta
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Ile to jest 1+1 w Java'ie?
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
var bywa niebezpieczne :-)
Autoboxing/Unboxing nie lubi sie z var - nadal ;-)

Brak komentarzy:

Prześlij komentarz