Referencje – pojęcie i zastosowanie

Wszystkie obiekty w języku Java są obsługiwane przez referencje. Nie należy ich jednak mylić ze wskaźnikami lub referencjami języka C++. Różnica polega na tym, że referencje w języku Java nie odnoszą się bezpośrednio do lokalizacji pamięci, ale zawierają wskaźnik do rzeczywistej lokalizacji pamięci, do której programista nie może uzyskać bezpośredniego dostępu. Ten dodatkowy poziom pośrednictwa jest wymagany m.in. do działania Garbage CollectoraGarbage Collector (GC)Garbage Collectora.

Przyjrzymy się definicji klasy o nazwie Osoba, która zawiera pole imie typu String służące do przechowywania imienia osoby. W głównej metodzie programu tworzony jest nowy obiekt klasy Osoba o nazwie znajomy, a do pola imie tego obiektu przypisywane jest imię „Artur”. Poprzez wykonanie tego kodu, tworzony jest obiekt reprezentujący osobę o imieniu „Artur”, co demonstruje podstawowe zastosowanie klas i obiektów w programowaniu obiektowym w języku Java.

Linia 1. prawy ukośnik prawy ukośnik Definicja klasy Osoba. Linia 2. class Osoba otwórz nawias klamrowy. Linia 3. prawy ukośnik prawy ukośnik Pole imie typu String przechowujące imię osoby. Linia 4. String imie średnik. Linia 6. prawy ukośnik prawy ukośnik Główna metoda programu. Linia 7. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik Utworzenie nowego obiektu klasy Osoba. Linia 9. Osoba znajomy znak równości new Osoba otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 11. prawy ukośnik prawy ukośnik Przypisanie wartości do pola imie obiektu znajomy. Linia 12. znajomy kropka imie znak równości cudzysłów Artur cudzysłów średnik. Linia 13. zamknij nawias klamrowy. Linia 14. zamknij nawias klamrowy.

Zwróć uwagę na słowo kluczowe new.

Słowo kluczowe new w języku Java służy do tworzenia nowych obiektów. Gdy go używamy, rezerwujemy pamięć na nowy obiekt na stercie (z j. ang. heap) i inicjalizujemy go zgodnie z definicją jego klasy. Ogólna składnia new wygląda następująco:

Linia 1. TypObiektu nazwaObiektu znak równości new TypObiektu otwórz nawias okrągły zamknij nawias okrągły średnik.

gdzie:

  • TypObiektu to nazwa klasy obiektu, który chcemy utworzyć;

  • nazwaObiektu to nazwa zmiennej, która będzie przechowywać referencję do nowo utworzonego obiektu.

Kiedy słowo kluczowe new tworzy obiekt klasy Osoba, jest on przechowywany w obszarze pamięci zwanym stertąstertastertą. Referencja znajomy odwołuje się do nowo utworzonego obiektu. Należy również podkreślić, że zmienna znajomy tak naprawdę nie jest obiektem. Przechowuje jedynie informację, gdzie obiekt znajduje się w pamięci.

Możemy przypisywać referencje wielu zmiennym, które jeszcze nie odwołują się do żadnego obiektu. Technika ta jest szczególnie ważna przy implementacji struktur, takich jak drzewa binarne, listy, czy dowolne struktury z dowiązaniami.

Zaprezentujemy kod, który przedstawia klasę o nazwie Osoba, która zawiera pole imie typu String służące do przechowywania imienia osoby. Następnie w głównej metodzie programu utworzymy obiekt klasy Osoba o nazwie znajomy, a do jego pola imie przypiszemy imię „Jan”. W kodzie wykorzystamy również mechanizm referencji poprzez deklarację zmiennej brat typu Osoba, która początkowo jest inicjalizowana jako null, a następnie przypisywana jest do niej referencja do obiektu znajomy.

Kiedy zmienne bratznajomy wskazują na ten sam obiekt, zmiany dokonane na jednej zmiennej (np. zmiana imienia za pomocą brat.imie = "Artur") będą miały wpływ na obie zmienne, ponieważ obie wskazują na ten sam obiekt. Oznacza to, że zarówno znajomy.imie jak i brat.imie będą teraz równoważne z „Artur”, ponieważ zmieniliśmy imię na obiekcie wskazywanym przez obie zmienne.

Linia 1. prawy ukośnik prawy ukośnik Definicja publicznej klasy Osoba. Linia 2. public class Osoba otwórz nawias klamrowy. Linia 3. prawy ukośnik prawy ukośnik Pole imie typu String przechowujące imię osoby. Linia 4. String imie średnik. Linia 6. prawy ukośnik prawy ukośnik Główna metoda programu. Linia 7. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik Utworzenie nowego obiektu klasy Osoba. Linia 9. Osoba znajomy znak równości new Osoba otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik Przypisanie wartości do pola imie obiektu znajomy. Linia 11. znajomy kropka imie znak równości cudzysłów Jan cudzysłów średnik. Linia 12. prawy ukośnik prawy ukośnik Wyświetlenie imienia znajomy. Linia 13. System kropka out kropka println otwórz nawias okrągły znajomy kropka imie zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik apostrof Jan apostrof. Linia 15. prawy ukośnik prawy ukośnik Deklaracja zmiennej brat typu Osoba i inicjalizacja jej jako null. Linia 16. Osoba brat znak równości null średnik. Linia 17. prawy ukośnik prawy ukośnik Przypisanie obiektu znajomy do zmiennej brat. Linia 18. brat znak równości znajomy średnik. Linia 19. prawy ukośnik prawy ukośnik Wyświetlenie pola imie dla zmiennej brat otwórz nawias okrągły które jest takie samo jak znajomy zamknij nawias okrągły. Linia 20. System kropka out kropka println otwórz nawias okrągły brat kropka imie zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik apostrof Jan apostrof. Linia 21. prawy ukośnik prawy ukośnik Zmiana imienia w obiekcie wskazywanym przez brat. Linia 22. brat kropka imie znak równości cudzysłów Artur cudzysłów średnik. Linia 23. prawy ukośnik prawy ukośnik Ponieważ zmienne brat i znajomy wskazują na ten sam obiekt przecinek zmiana imienia wpływa na oba. Linia 24. System kropka out kropka println otwórz nawias okrągły znajomy kropka imie zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik apostrof Artur apostrof. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. Jan prawy ukośnik prawy ukośnik Program wyświetli apostrof Jan apostrof przecinek. Linia 2. prawy ukośnik prawy ukośnik ponieważ to jest wartość przypisana. Linia 3. prawy ukośnik prawy ukośnik do pola imie obiektu znajomy kropka. Linia 4. Jan prawy ukośnik prawy ukośnik Program wyświetli apostrof Jan apostrof przecinek. Linia 5. prawy ukośnik prawy ukośnik ponieważ brat wskazuje na ten sam obiekt przecinek. Linia 6. prawy ukośnik prawy ukośnik co znajomy kropka. Linia 7. Artur prawy ukośnik prawy ukośnik Program wyświetli apostrof Artur apostrof kropka. Linia 8. prawy ukośnik prawy ukośnik Mimo że zmiana została dokonana poprzez zmienną brat przecinek. Linia 9. prawy ukośnik prawy ukośnik zmienna znajomy również rejestruje tę zmianę przecinek. Linia 10. prawy ukośnik prawy ukośnik ponieważ obie zmienne odnoszą się do tego samego. Linia 11. prawy ukośnik prawy ukośnik obiektu w pamięci kropka.

Język Java zawsze przekazuje parametry przez wartość. Choć dla typów prymitywnychzmienna typu prymitywnegotypów prymitywnych jest to dość oczywiste, to jednak dla obiektów charakterystyka ta może budzić wątpliwości. Przeanalizujmy następujący przykład, w którym za pomocą metody zmieniamy stan obiektu.

Linia 1. public class Osoba otwórz nawias klamrowy. Linia 2. prawy ukośnik prawy ukośnik Deklaracja zmiennej instancji imie przecinek która będzie przechowywać imię osoby. Linia 3. String imie średnik. Linia 5. prawy ukośnik prawy ukośnik Metoda statyczna zmienImie przecinek która przyjmuje obiekt klasy Osoba. Linia 6. prawy ukośnik prawy ukośnik i zmienia jego pole imie na apostrof Ania apostrof. Linia 7. static void zmienImie otwórz nawias okrągły Osoba osoba zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. osoba kropka imie znak równości cudzysłów Ania cudzysłów średnik. Linia 9. zamknij nawias klamrowy. Linia 11. prawy ukośnik prawy ukośnik Główna metoda klasy. Linia 12. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. prawy ukośnik prawy ukośnik Tworzenie nowego obiektu klasy Osoba. Linia 14. Osoba znajoma znak równości new Osoba otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 16. prawy ukośnik prawy ukośnik Przypisanie wartości apostrof Ola apostrof do pola imie obiektu znajoma. Linia 17. znajoma kropka imie znak równości cudzysłów Ola cudzysłów średnik. Linia 18. prawy ukośnik prawy ukośnik Wyświetlenie wartości pola imie obiektu znajoma. Linia 19. System kropka out kropka println otwórz nawias okrągły znajoma kropka imie zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik apostrof Ola apostrof. Linia 21. prawy ukośnik prawy ukośnik Wywołanie metody zmienImie dla obiektu znajoma. Linia 22. zmienImie otwórz nawias okrągły znajoma zamknij nawias okrągły średnik. Linia 23. prawy ukośnik prawy ukośnik Ponowne wyświetlenie wartości pola imie obiektu znajoma przecinek po zmianie. Linia 24. System kropka out kropka println otwórz nawias okrągły znajoma kropka imie zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik apostrof Ania apostrof. Linia 25. zamknij nawias klamrowy. Linia 26. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. Ola prawy ukośnik prawy ukośnik Wypisuje apostrof Ola apostrof przecinek ponieważ to jest. Linia 2. prawy ukośnik prawy ukośnik aktualna wartość pola imie obiektu znajoma kropka. Linia 3. Ania prawy ukośnik prawy ukośnik Wypisuje apostrof Ania apostrof przecinek ponieważ metoda. Linia 4. prawy ukośnik prawy ukośnik zmienImie zmieniła wartość pola imie obiektu znajoma kropka.

Po wywołaniu funkcji zmienImie() to nie wartość obiektu, lecz referencja znajoma jest kopiowana. Błędne jest twierdzenie, że obiekty w języku Java przekazywane są przez referencje. Język Java przekazuje każdy parametr przez wartość niezależnie od jego typu.

Dynamiczna alokacja pamięci

Maszyna wirtualna Javy przy uruchomieniu programu rezerwuje miejsce w pamięci RAM, które jest przeznaczone dla różnych komponentów maszyny. Wyjaśnimy działanie jedynie dwóch głównych sektorów wirtualnej pamięci Java, czyli stertystertastertystosustosstosu wątków.

R1cCHunLmGpUg1
Zawartość stosu i sterty wirtualnej maszyny Java tuż przed zakończeniem działania metody pobierzWiek()
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Stos w wirtualnej maszynie Java to sekcja pamięci, która zawiera metody, zmienne lokalne i zmienne referencyjne. Dostęp do zawartości stosu jest zawsze wykonywany w kolejności LIFOLIFO (ang. Last In, First Out)LIFO. Gdy wywoływana jest funkcja, na szczycie stosu rezerwowany jest blok zawierający zmienne lokalne i referencje. Kiedy funkcja zakończy działanie blok odpowiadający funkcji zostaje zdjęty ze stosu, a wszystkie zmienne niezbędne do działania funkcji zostają usunięte.

Sterta to pamięć zarezerwowana na potrzeby alokacji dynamicznej. W przeciwieństwie do stosu nie ma wzorca określającego kolejność przydziału i zwalniania bloków. Można przydzielić blok w dowolnym momencie i w dowolnym czasie go zwolnić. Sterta służy do przechowywania typów obiektowych.

Zmienne referencyjne przechowują informację, gdzie obiekt, do którego się odwołują, przechowywany jest na stercie.

Ważne!

Zmienne String stworzone poprzez podanie wartości w cudzysłowie będą przechowywane w specjalnym miejscu na stercie zwanym String Pool. Inaczej będzie jeśli stworzymy obiekt typu String z użyciem słowa kluczowego new. Wtedy tak stworzony łańcuch znaków zostanie umieszczony poza String Pool w pewnym miejscu sterty (podobnie jak zwykły obiekt).

Garbage collector jest komponentem wirtualnej maszyny Java, który odpowiada za czyszczenie sterty. Śledzi obiekty w stercie i sprawdza, ile referencji odwołuje się do każdego z nich. Jeśli komponent zauważy obiekt, do którego nie odwołuje się żadna referencja, zwalnia obiekt ze sterty.

Ważne!

Stos

Sterta

zmienne utworzone na stosie, które wyjdą poza zakres, są automatycznie usuwane

obiekty, do których nie odwołuje się żadna referencja, są usuwane przez Garbage collector

jest szybszy w alokacji w porównaniu ze stertą

jest wolniejsza w alokacji w porównaniu ze stosem

przechowuje jedynie metody i zmienne lokalne metody

przechowuje instancje obiektów, do których odwołujemy się za pomocą referencji

może wystąpić przepełnienie, gdy zbyt dużo elementów znajduje się na stosie

mogą wystąpić błędy alokacji, jeśli zażądano przydzielenia zbyt dużego rozmiaru pamięci

jeśli stos jest przepełniony, Java zgłasza java.lang.StackOverFlowError

jeśli sterta jest zapełniona, Java zgłasza błąd java.lang.OutOfMemoryError

Tablice dynamiczne

W języku Java klasyczne tablice mają stałą wielkość. Oznacza to, że po tym jak nadamy im określony rozmiar, nie można ich rozszerzać ani zmniejszać. Aby zmienić rozmiar, trzeba utworzyć nową tablicę i skopiować dotychczasowe elementy. Operacja taka jest wysoce nieefektywna i uciążliwa.

Na szczęście istnieje już zdefiniowana kolekcja, która dostosowuje swój rozmiar, kiedy tylko zajdzie taka potrzeba. Kolekcja ta nazywa się ArrayList (znana także jako lista tablicowa) i jest jedną z klas Java Collection Framework. Listy tablicowe są również nazywane tablicami dynamicznymi, ponieważ ich rozmiar może się zmieniać w trakcie działania programu.

By skorzystać z tejże kolekcji, zaimportujemy zarówno klasę java.util.ArrayList, jak i interfejs java.util.List. Obiekt tej kolekcji deklarujemy następująco:

Linia 1. prawy ukośnik prawy ukośnik Importowanie klasy ArrayList z pakietu java kropka util. Linia 2. import java kropka util kropka ArrayList średnik. Linia 3. prawy ukośnik prawy ukośnik Importowanie interfejsu List z pakietu java kropka util. Linia 4. import java kropka util kropka List średnik. Linia 6. prawy ukośnik prawy ukośnik Deklaracja klasy publicznej TabliceDynamiczne. Linia 7. public class TabliceDynamiczne otwórz nawias klamrowy. Linia 8. prawy ukośnik prawy ukośnik Główna metoda programu. Linia 9. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. prawy ukośnik prawy ukośnik Deklaracja zmiennej listaTablicowa typu interfejsu List przecinek która przechowuje obiekty typu Integer. Linia 11. prawy ukośnik prawy ukośnik Inicjalizacja zmiennej listaTablicowa jako nowy obiekt ArrayList. Linia 12. prawy ukośnik prawy ukośnik ArrayList to klasa implementująca interfejs List przecinek która używa tablicy do przechowywania elementów. Linia 13. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny listaTablicowa znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy.

Lista tablicowa jest klasą generycznątyp generycznyklasą generyczną z parametrem określonego typu, dlatego należy określić wewnątrz nawiasów ostrych typ przechowywanych wyrazów. Jedynym ograniczeniem jest to, że wyrazy muszą być obiektem. Dla typów prymitywnych należy wpisać ich obiektowy odpowiednik. Na przykład, jeśli lista tablicowa ma składać się z liczb całkowitych, musimy wpisać Integer tam, gdzie określamy typ przechowywanych elementów.

Sama lista tablicowa w tym momencie jest pusta, ale możemy modyfikować zawartość kolekcji niektórymi z metod opisanych w tabeli.

add()

Dodaje element na początek stosu; zwraca true, jeśli operacja się udała.

get()

Zwraca element na określonej pozycji podanej przez argument, lista tablicowa musi zawierać podaną pozycję.

clear()

Usuwa wszystkie wyrazy z listy tablicowej, w konsekwencji lista tablicowa staje się pusta.

size()

Zwraca liczbę wszystkich wyrazów aktualnie znajdujących się w liście tablicowej.

set()

Przypisuje wyrazowi o pewnym indeksie daną wartość, np. instrukcja:

zmienia wartość elementu listy lista o indeksie 1 i przypisuje jej wartość 20.

remove()

Usuwa wyraz na określonej pozycji listy tablicowej.

Funkcja

Zastosowanie

add()

Dodaje element na początek stosu; zwraca true, jeśli operacja się udała.

get()

Zwraca element na określonej pozycji podanej przez argument, lista tablicowa musi zawierać podaną pozycję.

clear()

Usuwa wszystkie wyrazy z listy tablicowej, w konsekwencji lista tablicowa staje się pusta.

size()

Zwraca liczbę wszystkich wyrazów aktualnie znajdujących się w liście tablicowej.

set()

Przypisuje wyrazowi o pewnym indeksie daną wartość, np. instrukcja:

zmienia wartość elementu listy lista o indeksie 1 i przypisuje jej wartość 20.

remove()

Usuwa wyraz na określonej pozycji listy tablicowej.

Metodę remove najlepiej stosować tylko dla elementów znajdujących się na końcu kolekcji. Wtedy nie tracimy zbyt dużo na szybkości działania, ponieważ złożoność czasowa takiej operacji wynosi . W sytuacjach, które wymagają usuwania elementów niekoniecznie znajdujących się na końcu, stosujemy inną kolekcję, np. LinkedList.

Lista tablicowa jest stosowana w każdej sytuacji, gdy priorytetem jest szybki dostęp do elementów kolekcji, które usuwać będziemy tylko w ostateczności.

Na pewno spotkamy się z sytuacją, w której potrzeba będzie iterować po każdym elemencie listy tablicowej. Sposobów iteracji jest wiele, my skupimy się na dwóch najefektywniejszych - przy użyciu pętli for oraz jej rozszerzonej wersji.

Iteracja pętlą for

Zapoznajmy się z przykładem iterowania po każdym elemencie listy tablicowej, w którym wykorzystujemy pętlę for.

Linia 1. import java kropka util kropka ArrayList średnik. Linia 2. import java kropka util kropka List średnik. Linia 4. public class Dynamiczne otwórz nawias klamrowy. Linia 5. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. prawy ukośnik prawy ukośnik Tworzenie listy tablicowej listaTablicowa przecinek która przechowuje obiekty typu Integer. Linia 7. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny listaTablicowa znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 9. prawy ukośnik prawy ukośnik Dodanie elementów do listy. Linia 10. listaTablicowa kropka add otwórz nawias okrągły 5 zamknij nawias okrągły średnik. Linia 11. listaTablicowa kropka add otwórz nawias okrągły 9 zamknij nawias okrągły średnik. Linia 12. listaTablicowa kropka add otwórz nawias okrągły 1 zamknij nawias okrągły średnik. Linia 13. listaTablicowa kropka add otwórz nawias okrągły 8 zamknij nawias okrągły średnik. Linia 14. listaTablicowa kropka add otwórz nawias okrągły 7 zamknij nawias okrągły średnik. Linia 16. prawy ukośnik prawy ukośnik Używanie zwykłej pętli for do iteracji po każdym elemencie listy. Linia 17. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny listaTablicowa kropka size otwórz nawias okrągły zamknij nawias okrągły średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. int wyraz znak równości listaTablicowa kropka get otwórz nawias okrągły i zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Pobieranie elementu z listy na indeksie i. Linia 19. prawy ukośnik prawy ukośnik Wyświetlanie każdego elementu listy oddzielonego spacją. Linia 20. System kropka out kropka print otwórz nawias okrągły wyraz plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 21. zamknij nawias klamrowy. Linia 22. prawy ukośnik prawy ukośnik Po zakończeniu pętli lista zostanie wyświetlona w jednej linii w formacie dwukropek 5 9 1 8 7. Linia 23. zamknij nawias klamrowy. Linia 24. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. 5 9 1 8 7 prawy ukośnik prawy ukośnik Wynik działania programu to. Linia 2. prawy ukośnik prawy ukośnik wyświetlenie wszystkich elementów listy. Linia 3. prawy ukośnik prawy ukośnik w jednej linii oddzielonych spacjami kropka.

Iteracja rozszerzoną pętlą for

W tym przykładzie wykorzystujemy rozszerzoną pętlę for‑each. Rozszerzona pętla for‑each umożliwia prostsze i bardziej czytelne iterowanie po elementach kolekcji, takich jak tablice czy listy, bez konieczności korzystania z tradycyjnej pętli for z indeksami.

Pętla for‑each jest używana w następujący sposób:

Linia 1. for otwórz nawias okrągły typ elementu dwukropek kolekcja zamknij nawias okrągły.

W przypadku tego kodu int wyraz : listaTablicowa, typ elementu to int, ponieważ listaTablicowa przechowuje obiekty typu Integer.

Wewnątrz pętli for‑each każdy element wyraz z listy listaTablicowa jest dostępny w każdej iteracji, a kod w bloku pętli może operować na tym elemencie. W tym przypadku każdy element listy jest wyświetlany za pomocą System.out.print(wyraz + " "), co powoduje wyświetlenie elementów listy oddzielonych spacją w jednej linii.

Rozszerzona pętla for‑each jest użyteczna, gdy chcemy przeiterować po wszystkich elementach kolekcji bez konieczności śledzenia indeksów ani długości kolekcji. Jest to prosty i czytelny sposób przeglądania elementów w kolekcji, który pomaga uniknąć błędów związanych z indeksami oraz skraca kod.

Linia 1. import java kropka util kropka ArrayList średnik. Linia 2. import java kropka util kropka List średnik. Linia 4. public class Dynamiczne otwórz nawias klamrowy. Linia 5. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. prawy ukośnik prawy ukośnik Tworzenie listy tablicowej listaTablicowa przecinek która przechowuje obiekty typu Integer. Linia 7. List otwórz nawias ostrokątny Integer zamknij nawias ostrokątny listaTablicowa znak równości new ArrayList otwórz nawias ostrokątny zamknij nawias ostrokątny otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 9. prawy ukośnik prawy ukośnik Dodanie elementów do listy. Linia 10. listaTablicowa kropka add otwórz nawias okrągły 5 zamknij nawias okrągły średnik. Linia 11. listaTablicowa kropka add otwórz nawias okrągły 9 zamknij nawias okrągły średnik. Linia 12. listaTablicowa kropka add otwórz nawias okrągły 1 zamknij nawias okrągły średnik. Linia 13. listaTablicowa kropka add otwórz nawias okrągły 8 zamknij nawias okrągły średnik. Linia 14. listaTablicowa kropka add otwórz nawias okrągły 7 zamknij nawias okrągły średnik. Linia 16. prawy ukośnik prawy ukośnik Używanie pętli for minus each do iteracji po każdym elemencie listy. Linia 17. for otwórz nawias okrągły int wyraz dwukropek listaTablicowa zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. prawy ukośnik prawy ukośnik Wyświetlanie każdego elementu listy oddzielonego spacją. Linia 19. System kropka out kropka print otwórz nawias okrągły wyraz plus cudzysłów cudzysłów zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy. Linia 21. prawy ukośnik prawy ukośnik Po zakończeniu pętli lista zostanie wyświetlona w jednej linii w formacie dwukropek 5 9 1 8 7. Linia 22. zamknij nawias klamrowy. Linia 23. zamknij nawias klamrowy.

Wynik działania programu:

Linia 1. 5 9 1 8 7 prawy ukośnik prawy ukośnik Wynik działania programu to. Linia 2. prawy ukośnik prawy ukośnik wyświetlenie wszystkich elementów listy. Linia 3. prawy ukośnik prawy ukośnik w jednej linii oddzielonych spacjami kropka.

Słownik

Garbage Collector (GC)
Garbage Collector (GC)

mechanizm zarządzania pamięcią, który automatycznie identyfikuje i zwalnia pamięć, która nie jest już używana przez program

LIFO (ang. Last In, First Out)
LIFO (ang. Last In, First Out)

ogólna zasada przetwarzania zasobów (cyfrowych lub fizycznych), zakładająca obsługiwanie w pierwszej kolejności tych elementów (a zarazem przekazanie ich na wyjście systemu), które jako ostatnie znalazły się na wejściu rozpatrywanego systemu

sterta
sterta

struktura danych, w której informacje są ulokowane w sposób hierarchiczny

stos
stos

struktura danych, w której informacje są pobierane ze szczytu i na niego odkładane; struktura typu LIFO (Last In, First Out – ostatni na wejściu, pierwszy na wyjściu)

typ generyczny
typ generyczny

klasa lub interfejs, który jest sparametryzowany względem typów podanych przy deklaracji; aby określić parametr typu, używamy nawiasów ostrych <>; typy generyczne umożliwiają napisanie ogólnej definicji, która działa z różnymi typami, umożliwiając tym samym ponowne użycie kodu, bez konieczności definiowania nowych definicji klas lub interfejsu działających na innym typie zmiennych

zmienna typu prymitywnego
zmienna typu prymitywnego

zmienne typu prymitywnego przechowują w pamięci konkretne wartości; przykład:

Linia 1. int liczba znak równości 7 średnik.

wartości te nie są obiektami