Przechodzimy do wyjaśnienia sobie jednej ze struktur danych, z której będziesz często korzystać jeśli chodzi o Javę. "ArrayList" w języku Java jest najbardziej podstawową kolekcją, którą zdecydowana większość z nas poznała jako pierwszą w swoim życiu i czas najwyższy po latach uzupełnić serię artykułów o ten wpis 😯!
"ARRAYLIST" W JĘZYKU JAVA ABSTRAKCYJNYM "DWA W JEDNYM"
Wielu programistów nie bez kozery ochoczo sięga po tę kolekcję (grupę elementów przechowywanych w strukturze danych). "Lista tablicowa" skutecznie łączy plusy statycznej i dynamicznej struktury danych - tablicę oraz listę wiązaną. Przypomnę, że wadą tablic jest niemożność modyfikowania rozmiarów podczas działania programu, a lista musi przejść po wszystkich elementach poczynając od początku celem znalezienia poszukiwanego elementu. Łapiesz 😄?
To "ArrayList" jest takim magicznym "dwa w jednym" 🌟. Możesz odwołać się szybko do dowolnego elementu przy użyciu notacji indeksowej i jednocześnie zmieniać rozmiar struktury poprzez dodawanie i usuwanie elementów 💪. Wiadomo, że to nie będzie w stu procentach oddanie tych pierwotnych struktur danych (myślę tu o wydajności), natomiast w dobie dzisiejszych możliwości sprzętowych na pewno nie będzie to żadnym obciążeniem przy liczbie elementów liczących w wielu tysiącach 🙂.
"ARRAYLIST" W AKCJI
Trzeba pokazać kod źródłowy, bo bez niego nie wystartujemy 😜. Tworzymy sobie instancję na podstawie klasy w taki sam sposób, z niewielkim "dodatkiem" po nazwie typu danych:
ArrayList<Integer> numbers = new ArrayList();
Nawiasy kątowe z typem danych elementów wewnątrz nich! Ponieważ to jest lista zdolna do przechowywania elementów, należy przekazać informację jakiego typu mają być elementy i takiego trzeba się trzymać przez cały cykl jej życia (zatem nie można wstawiać do niej wszystkiego jak leci)! Java któryś raz z rzędu każe zrobić troszeczkę wbrew intuicji i jeżeli to ma reprezentować dowolny z typów prostych, to nie wstawiamy jej "klasycznego" słowa kluczowego:
int
tylko stosujemy odpowiednik jej tzw. klasy opakowującej. Czyli dla "int" będzie to "Integer" itd. Zostawiam tabelkę z odpowiednikami dla każdego typu prostego:
NAZWA | KLASA OPAKOWUJĄCA |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
Obecność nawiasów kątowych świadczy o występowaniu typu generycznego - bardzo potężnej broni w składniowym arsenale, który pozwala na "samoprzekstałcanie się" w typ konkretny wskazany przez nas. Więcej informacji zostawiam w załączonym artykule, ponieważ to nie jest miejsce do tłumaczenia tak ważnego zagadnienia ☝.
DODAWANIE ELEMENTÓW
Mamy dwie drogi dodawania elementów do "ArrayList" w języku Java: albo bezpośrednio już w momencie tworzenia obiektu:
ArrayList<Integer> numbers = new ArrayList(Arrays.asList(56, 83, 700, 2));
i po raz kolejny trzeba "wykiwać" Javę wywołując metodę "asList" i dopiero do niej dodać tyle elementów ile chcemy 😏, albo poprzez metodę "add":
numbers.add(70);
numbers.add(Arrays.asList(1973, 81));
podając pojedynczo bądź wiele naraz używając tej samej metody 😁.
USUWANIE ELEMENTÓW
Usuwanie elementów z listy odbywa się równie prosto, co przy dodawaniu - po prostu wywołujemy metodę "remove":
numbers.remove(81);
tylko tu pewna pułapka związana z typem liczby całkowitej!!! Wersja metody oczekująca za parametr "int", będzie "myśleć" że chodzi o indeks, na którym dany element się znajduje. Jeżeli chcemy, aby doszło do usunięcia wskazanej liczby, musimy zastosować rzutowanie na obiekt "Integer":
numbers.remove((Integer)81);
Dobra nowina: program się nie wysypie, jeżeli obiekt nie zostanie znaleziony ⭐. Wysypie się za to wtedy, gdy indeks wyjdzie poza rozmiar listy (poprzednia wersja metody)! Co jeżeli byśmy chcieli usuwać własne obiekty? Wtedy trzeba zadbać o identyfikowanie "równości" obiektów - odwołuję do osobnego artykułu na temat "hashCode".
ITEROWANIE PO ELEMENTACH
Co do "przechodzenia" po wszystkich elementach "ArrayList" w języku Java, mamy pełną swobodę w działaniu, jednak najwygodniej korzystać z dwóch zapisów: pętli "for" i pętli rozszerzonej "foreach". Tak może wyglądać wypisywanie wszystkich elementów jeden po drugim używając pętli "for":
for (int i = 0; i < numbers.size(); ++i) {
System.out.println(i);
}
Do ograniczania używamy metody "size", która zwróci nam liczbę jako rozmiar. Najlepiej ją stosować w momencie, kiedy nie chcesz iterować po wszystkich elementach bez wyjątku, bo możesz sterować wartością zmiennej iteracyjnej. Kiedy jednak Ci to nie przeszkadza, sięgnij po pętlę "foreach", bo jest bardziej zwięzła:
for (int i : numbers) {
System.out.println(i);
}
Zobacz, że tutaj kompilator nie będzie od Ciebie wymagał klasy opakowującej dla typu prostego, tylko tu już masz prawo napisać zwyczajnie "int" 👍.
Kolekcja "ArrayList" w języku Java łączy tablicę i listę wiązaną, ponieważ pozwala na elastyczne modyfikowanie rozmiaru i odwoływanie się do każdego elementu przy użyciu notacji indeksowej.
Tyle, to wszystko co musisz wiedzieć na temat jednej z najczęściej używanych kolekcji w programach pisanych w Javie 😇.