CORE Flashcards
Czym jest JVM ?
Java Virtual Machine (JVM) to środowisko uruchomieniowe, które umożliwia wykonywanie kodu napisanego w języku Java na różnych platformach
- Działa jako warstwa abstrakcyjna pomiędzy kodem źródłowym, a systemem operacyjnym, co pozwala na tłumaczenie i wykonywanie kodu Java bezpośrednio na danej platformie.
- JVM jest wykorzystywany do interpretacji kodu bajtowego, a także do optymalizacji wydajności aplikacji.
- odśmiecanie pamięci
- obługa wyjątków
- biblioteka standardowa
Czym jest byte code ?
Kod bajtowy jest zestawem instrukcji dla wirtualnej maszyny Javy (ang. Java Virtual Machine: JVM). Interpreter kodu bajtowego Javy umożliwia wykonanie programu.
Z czego składa sie JVM ?
- Ładowarka klas (Class Loader).
- Sterta (Heap).
- Stosy języka (language Stacks)
- Rejestr komputera PC (PC Registers).
- Stosy metod natywnych (Native Method Stacks).
- Platforma programistyczna (Native Method Interface).
Biblioteki (Native Method Libraries).
Co to jest Execution Engine ?
wykonuje “.class” (kod bajtowy). Odczytuje kod bajtowy wiersz po wierszu, wykorzystuje dane i informacje obecne w różnych obszarach pamięci i wykonuje instrukcje
Składa się z :
- interpretera
- Just-in-time compiler
- garbage collector
Co to jest Class Loader ?
Jest to podsystem, który wykorzystuje się do ładowania plików klas. Wykonuje on ładowanie, inicjowanie i łączenie.
Method Arera
- wszystkie informacje o klasach
- bazwa klasy, metody, zmienne
Stack
- zmienne loklane
- wszystkie wątki mają swój stack
PC Registers
Przechowuje on adres aktualnie realizowanej instrukcji maszyny wirtualnej Java. Każdy wątek w Java posiada osobny rejestr PC.
Native Method Stacks
Zawiera wszystkie metody natywne używane w aplikacji.
Interpreter
wykonuje krok po kroku instrukcje programu zapisane w postaci kodu bajtowego
JIT w JVM
- FEATURE JVM które poprawia wydajność aplikacji
- kompiluje bytecode do kodu maszynowego w czasie wykonywania
- analizuje kod bajtowy i kompiluje do maszynowego jeśli zdecyduje, że jest często wykonywany kod
- pozwala to na szybsze wykonywanie kodu niż intepretowaniu kodu za każdym wykonaniem
- kompilator może reagować na faktyczne zapotrzebowanie użytkowników aplikacji w trakcie jej działania
Heap
- obiekty
Garbage Collection
- ## proces automatycznego uwalniania pamięci sterty przez usuwanie obiektów które nie są juz osiągalne przez program
Które obiekty są do Garabage Collection
Obiekt nie ma już żadnych referencji wskazujących na niego.
Wszystkie referencje do obiektu wyszły poza zakres.
JDK
- dostarcza środowisko do tworzenia (Development Tools) oraz wykonywania JRE
- kompilator debugger
JRE
- środowisko do wykonywania programów
Czym jest pakiet ?
- pakiet to przestrzeń nazw która organizuje zestaw powiązanych klas i interfejsów
- pakiety pomagają w zapobieganiu konfliktom nazw
- pakiety zapewniają również mechanizm kontroli widoczności
Equals i HashCode kontrakt ?
- jeśli x.equals(y) jest true, to x.hashCode() = y.hashCode().
- jeżeli informacje użyte w porównaniach equals() nie zostaną zmienione, to metoda hashCode() musi zawsze zwracać tę samą wartość.
- Dwa obiekty są róże equals mogą mieć ten sam hashcode ale nie powinny.
Czym Jest Hash?
- liczba całkowita, powstała na skutek funkcji hashujących
- główna zaletą hashu jest **prównywanie hashy **jest dużo szybsze niż porównywanie wszystkich pól
- wada - hashe nie są unikalne
- równość hashy nieoznacza równości pół
Jak tworzony jest hash ?
- Weź pewną liczbę – w książce Effective Java jest to narzucona liczba 17.
- Pomnóż aktualny hash przez 31
- Dodaj do hashu wartość/hash pola w klasie
- Krok drugi i trzeci wykonaj dla każdego pola
- Zwróć hash
Co jeśli nie zaimplementujemy equals i hashcode
- będziemy prównywać obiekty za pomocą referencji
- do porównywania obiektów na podstawie pól potrzebujemy zaimplementować metodę equals i hashCode
Co jesli nie dotrzymamy kontraktu hashcode equals
- Problemy z kolekcjami: Jeśli dwa różne obiekty mają ten sam kod hashCode i są uważane za równe przez equals, mogą one zastąpić siebie nawzajem w strukturach takich jak HashSet.
- Niespodziewane wyniki: Obiekty, które powinny być traktowane jako różne, mogą być traktowane jako identyczne, co może prowadzić do błędnych wyników w operacjach takich jak wyszukiwanie, dodawanie lub usuwanie z kolekcji.
- Problemy z wydajnością: Nieoptymalna implementacja hashCode() może prowadzić do problemów z wydajnością, gdy obiekty są używane w kolekcjach bazujących na hashach.
Konwersja zawężająca
- rzutowanie w dół łanucha dziedziczenia
- JVM sprawdza czy damy pboelt rzeczywiście dziedziczy ten typ
- używanie instanceof
Konwersja rozszerzająca
- rzutowanie w góre łanucacha dziedziczenia
- nie jest konieczne sprawdzanie
- Referencja do obiektu może być zawsze zapisana w zmiennej, której typ odpowiada typowi dowolnego z jej przodków.
metoda finalize
- Metoda finalize() w Javie jest metodą klasy Object, która służy do wykonania czynności czyszczenia przed zniszczeniem dowolnego obiektu.
- Jest ona wywoływana przez Garbage Collector przed zniszczeniem obiektów z pamięci.
- Metoda finalize() jest domyślnie wywoływana dla każdego obiektu przed jego usunięciem.
- Metoda ta pomaga Garbage Collectorowi zamknąć wszystkie zasoby używane przez obiekt i pomaga w optymalizacji JVM in-memory.
Do czego potrzebne są Wrapper Classes
- Kolekcje: W Javie kolekcje (takie jak ArrayList, HashMap itp.) mogą przechowywać tylko obiekty.
- Operacje na obiektach: Klasy opakowujące zawierają wiele przydatnych metod, które pozwalają na operacje na wartościach
- null: Typy proste nie mogą przyjmować wartości null, podczas gdy ich klasy opakowujące mogą
- Generics: Typy generyczne w Javie nie wspierają typów prostych, dlatego klasy opakowujące są używane w kontekście typów generycznych.
Dlaczego metoda main jest statyczna ?
Punkt startu programu: Gdy JVM (Java Virtual Machine) uruchamia aplikację, potrzebuje sposobu, aby wejść do programu bez tworzenia instancji klasy. Metoda main jest punktem wejścia do aplikacji Java, a jej statyczność pozwala JVM na jej wywołanie bez potrzeby tworzenia obiektu danej klasy.
Czy metoda main musi być publiczna ?
metoda main, która służy jako punkt wejścia do programu Java, zazwyczaj jest deklarowana jako public, aby JVM mogła ją wywołać.
Czy klasa może mieć wiecej metod main ?
Tak ale :
- Tylko jedna metoda jest punktem wejścia: W Javie tylko jedna sygnatura metody main jest rozpoznawana jako punkt wejścia dla aplikacji
- Możesz mieć wiele metod o nazwie main w jednej klasie, ale muszą one różnić się sygnaturą. Na przykład:
Modyfikatory dostępu
Czy można uruchomić program w javie bez main ?
Tylko w przypadku
- Blok statyczny: Jeśli klasa zawiera blok statyczny, ten blok zostanie wykonany podczas ładowania klasy. W takim przypadku możesz użyć klasy ClassLoader do załadowania klasy, co spowoduje wykonanie bloku statycznego.
Czym jest enum ?
- to specjalny typ danych w Javie, który reprezentuje zestaw stałych (predefiniowanych wartości)
- Enumy są używane do reprezentowania grupy nazwanych wartości stałych i pozwalają na definiowanie typów danych, które mogą przyjmować tylko określony zestaw wartości
Method overloading vs Method overriding