18Czym są typy generyczne i czym jest wymazywanie typów?
Typy generyczne pozwalają kodowi na wyrażanie bezpiecznych typologicznie kontenerów i API, takich jak `List<String>`. W czasie kompilacji kompilator sprawdza typy i wstawia rzutowania tam, gdzie to konieczne. W czasie wykonywania, większość informacji o typach generycznych jest wymazywana, więc `List<String>` i `List<Integer>` współdzielą tę samą klasę w czasie wykonywania. Z tego powodu nie można bezpośrednio utworzyć `new T()`, używać typów prostych jako parametrów typu, ani niezawodnie sprawdzić `instanceof List<String>`.
List<String> names = new ArrayList<>();
names.add("Alice");
List<? extends Number> producer;
List<? super Integer> consumer;
Odpowiedz na to pytanie z trenerem AI
19Czym jest Java Collections Framework?
Collections Framework to zestaw interfejsów i implementacji do przechowywania oraz przetwarzania grup obiektów. Główne interfejsy to `List`, `Set`, `Queue`, `Deque` i `Map`. Implementacje obejmują `ArrayList`, `LinkedList`, `HashSet`, `TreeSet`, `HashMap`, `TreeMap` i `PriorityQueue`. Kolekcję należy dobierać na podstawie wzorca dostępu, wymagań dotyczących kolejności, unikalności elementów, złożoności wyszukiwania, narzutu pamięciowego i wymagań w zakresie współbieżności.
List<String> list = new ArrayList<>();
Set<Long> ids = new HashSet<>();
Map<Long, User> usersById = new HashMap<>();
Deque<String> queue = new ArrayDeque<>();
Odpowiedz na to pytanie z trenerem AI
20Jak działa `HashMap`?
`HashMap` przechowuje wpisy w wiadrach (buckets), które są wybierane na podstawie skrótu (hash) klucza. Podczas wyszukiwania oblicza skrót, znajduje odpowiednie wiadro i porównuje klucze za pomocą metody `equals`. Kolizje są obsługiwane wewnątrz wiadra; we współczesnej Javie długie łańcuchy mogą zostać przekształcone w zrównoważone drzewa (treeified), gdy spełnione są odpowiednie warunki. `HashMap` dopuszcza jeden klucz o wartości null i wartości null, nie jest bezpieczna wątkowo (thread-safe) i może zmienić swój rozmiar, gdy przekroczony zostanie próg współczynnika obciążenia (load factor).
Map<Long, User> users = new HashMap<>();
users.put(user.id(), user);
User found = users.get(user.id());
Odpowiedz na to pytanie z trenerem AI
21Jaka jest różnica między HashMap, LinkedHashMap, TreeMap i ConcurrentHashMap?
HashMap zapewnia szybki, nieuporządkowany dostęp do danych i nie jest bezpieczna wątkowo (thread-safe). LinkedHashMap zachowuje kolejność wstawiania lub dostępu i jest użyteczna przy tworzeniu pamięci podręcznych typu LRU (Least Recently Used). TreeMap utrzymuje klucze posortowane według porządku naturalnego lub za pomocą obiektu Comparator i wykonuje operacje w czasie O(log n). ConcurrentHashMap jest zaprojektowana z myślą o dostępie współbieżnym przy wykorzystaniu synchronizacji segmentowej lub wewnętrznej, nie pozwala na wartości pustych (null) kluczy ani wartości, i przy dużym obciążeniu jest preferowana zamiast synchronizedMap.
map.computeIfAbsent(key, ignored -> loadValue());
Odpowiedz na to pytanie z trenerem AI
22Jaka jest różnica między ArrayList i LinkedList?
ArrayList jest oparta na tablicy. Zapewnia szybki dostęp indeksowany, zwarty układ pamięci i wydajną iterację, ale wstawianie elementów w środku wymaga ich przesuwania. LinkedList to lista podwójnie wiązana. Wstawianie jest w niej tańsze, jeśli pożądany węzeł jest już znany, jednak dostęp indeksowany wymaga czasu O(n), narzut pamięciowy jest wyższy, a lokalność w pamięci podręcznej (cache locality) jest gorsza. W wielu rzeczywistych zastosowaniach ArrayList jest szybsza, nawet jeśli występują w nich operacje wstawiania elementów.
Odpowiedz na to pytanie z trenerem AI
23Jaka jest różnica między Comparable a Comparator?
Comparable definiuje naturalny porządek wewnątrz klasy za pomocą metody compareTo. Comparator to oddzielny obiekt lub wyrażenie lambda, które definiuje sposób sortowania z zewnątrz. Comparable przydaje się, gdy dany typ posiada jeden, oczywisty porządek domyślny. Comparator sprawdza się lepiej, gdy istnieje wiele kryteriów sortowania, na przykład według nazwy, daty lub priorytetu. Metody compare i compareTo muszą być spójne i najlepiej kompatybilne z metodą equals, gdy są używane w posortowanych zbiorach lub mapach.
class User implements Comparable<User> {
private int age;
@Override
public int compareTo(User other) {
return Integer.compare(age, other.age);
}
}
Comparator<User> byName =
Comparator.comparing(User::getName);
Comparator<User> byAgeThenName =
Comparator.comparingInt(User::getAge)
.thenComparing(User::getName);
Odpowiedz na to pytanie z trenerem AI