Przypisanie tablicy jednej do drugiej, nie tworzy dwóch tablic

Dzisiaj się nad tym zastanawiałem, chyba z pół godziny siedziałem patrząc się na 4 linijki kodu i nie mogłem za nic zrozumieć, o co tam chodzi.

Przerabiam sobie tak powtórzeniowo zadanka z samouczka programisty i w jednym zadaniu było polecenie, by posortować tablicę. Oczywiście, że jest na to gotowa metoda w Arrraysach, ale ja ćwiczę, wiec postanowiłem sam stworzyć prostą metodę sortującą bąbelkowo.

Za pierwszym razem całkiem sprawnie mi to poszło. Jednak kilka zadań później znowu było takie polecenie. I już kusiło mnie, żeby skorzystać z gotowej metody (bo przecież już to umiem), ale jednak jak tak w pamięci rozważałem jak to zrobić, to nie do końca wszystko pamiętałem, więc postanowiłem zrobić to znowu.

I co się okazało, że za drugim razem, mimo, iż część pamiętałem sprzed kilku godzin, to jednak nie wychodzi. Nie działa. Zgłupiałem. Wiesz jak to jest, jak już się siedzi nad czymś długo, to proste rzeczy potrafią sprawić problem i tak było i tym razem. Wziąłem kartkę i krok po kroku rozpisywałem, co się dzieje i na kartce wychodziło, że dobrze, a program nie działał. Nawet kaczka nie pomogła...

Po pół godzinnym wpatrywaniu się w to samo poddałem się. Postanowiłem napisać post na grupie na fejsie. Byłem gotowy na proste wyjaśnienia, jednak jak się okazało, nie chodziło o błąd logiczny, tylko o właściwość tablic w Javie. Otóż dowiedziałem się, że jak się stworzy tablicę i przypisze do niej po prostu drugą tablicę, to nie powstanie nowa tablica, tylko nowe przekierowanie do tego samego miejsca w pamięci.

Czyli zapis: int[] arr = oldArr; nie zrobi nowej tablicy. Bo jeżeli w takim razie zmienimy coś w jednej, to zmieni się też i w drugiej. Żeby zrobić nową tablicę, trzeba albo przeiterować ze starej, albo użyć Arrays.copyOf. Nawet jest o tym wątek na Stackoverflow.

Ogólnie to gdzieś już o tym słyszałem, ale jak widać potwierdza się, że trzeba ćwiczyć :)

To tyle ode mnie na dziś, będę wdzięczny, jeśli teraz Ty podzielisz się ze mną, swoim dzisiejszym odkryciem  np. w komentarzu :)

Komentarze

Popularne posty z tego bloga

IntelliJ: zmiana rozmiaru czcionki scrollem

ThunderBird: jak zrobić professional stopkę