środa, kwietnia 26, 2023

Autoboxing/Unboxing nie lubi sie z var - nadal ;-)

Znów miałem problem z autoboxingiem i znowu przez var ;-)
Aż zaczynam się zastanawiać czy tak go bardzo używać jak go używam....

Rozwiązywałem zadanie na LeetCode i miałem taki mniej więcej kod:

private PriorityQueue<Integer> pq;
[...]
var val = pq.poll();
while (!pq.isEmpty() && val==pq.peek()) pq.poll();

No i oczywiście działało, do momentu gdy w PriorityQueue miałem Integery mniejsze lub równe 127 i większe lub równe -128... bo wtedy Java używa tricku z tym, że wszystkie stworzone dla tych liczb przez autoboxing wskazują na te same obiekty, znaczy wszystkie 7 wskazują na ten sam dokładnie obiekt i porównanie == działa.
Oczywiście ja byłem święcie przekonany, że tu był unboxing i gdybym nie użył val, a


int val = pq.poll();


wszystko by działało.

Bez tego program przestawał działać dla większych przykładów, naprawiłem go przy pomocy zmiany linii z while na:

while (!pq.isEmpty() && val>=pq.peek()) pq.poll();


(czyli zamiana == na >=) i nie mogłem zrozumieć czemu teraz działa.... dopiero po jakimś czasie do mnie dotarło, że działa bo >= nie jest możliwy dla obiektów, więc Java musiała zrobić unboxing....
Po tym już umiałem poprawić swój program tak by działał prawidłowo ;-)




Podobne postybeta
var bywa niebezpieczne :-)
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Który kod (nie kot! ;-)) lepszy?
Ile to jest 1+1 w Java'ie?

Brak komentarzy:

Prześlij komentarz