18Що таке узагальнення (generics) і що таке стирання типів (type erasure)?
Узагальнення (generics) дозволяють коду виражати безпечні щодо типів контейнери та API (Application Programming Interfaces), наприклад List<String>. Під час компіляції компілятор перевіряє типи та вставляє приведення типів (casts), де це необхідно. Під час виконання більшість інформації про узагальнені типи видаляється, тому List<String> та List<Integer> використовують один і той самий клас під час виконання. Саме тому ви не можете безпосередньо створити new T(), використовувати примітивні параметри типів або надійно перевірити instanceof List<String>.
List<String> names = new ArrayList<>();
names.add("Alice");
List<? extends Number> producer;
List<? super Integer> consumer;
Відповісти на це запитання з ШІ-тренером
19Що таке Java Collections Framework?
Collections Framework — це набір інтерфейсів та їх реалізацій для зберігання та обробки груп об'єктів. Основні інтерфейси включають `List`, `Set`, `Queue`, `Deque` та `Map`. Реалізації включають `ArrayList`, `LinkedList`, `HashSet`, `TreeSet`, `HashMap`, `TreeMap` та `PriorityQueue`. Колекцію слід вибирати з огляду на спосіб доступу (access pattern), вимоги до впорядкування, унікальність елементів, складність пошуку, накладні витрати пам'яті та потреби в конкурентному (concurrency) доступі.
List<String> list = new ArrayList<>();
Set<Long> ids = new HashSet<>();
Map<Long, User> usersById = new HashMap<>();
Deque<String> queue = new ArrayDeque<>();
Відповісти на це запитання з ШІ-тренером
20Як працює HashMap?
`HashMap` зберігає записи (entries) у корзинах (buckets), які обираються за допомогою хешу ключа. Для пошуку обчислюється хеш, знаходиться відповідна корзина, і ключі порівнюються за допомогою методу `equals`. Колізії обробляються всередині корзини; у сучасній Java довгі ланцюжки можуть бути перетворені на збалансоване дерево (treeified) за певних умов. `HashMap` допускає один ключ `null` та значення `null`, не є потокобезпечним (thread-safe) і може змінювати розмір (resize), коли перевищується поріг коефіцієнта завантаження (load factor).
Map<Long, User> users = new HashMap<>();
users.put(user.id(), user);
User found = users.get(user.id());
Відповісти на це запитання з ШІ-тренером
21У чому різниця між `HashMap`, `LinkedHashMap`, `TreeMap` та `ConcurrentHashMap`?
`HashMap` забезпечує швидкий доступ без збереження порядку та не є потокобезпечним. `LinkedHashMap` зберігає порядок вставлення або доступу і є корисним для кешів типу LRU (Least Recently Used). `TreeMap` зберігає ключі відсортованими за природним порядком або за допомогою `Comparator` і виконує операції за час O(log n). `ConcurrentHashMap` призначений для конкурентного доступу з сегментованою або внутрішньою синхронізацією, не дозволяє використовувати `null` у якості ключів або значень, і є кращим вибором порівняно з `synchronizedMap` під навантаженням.
map.computeIfAbsent(key, ignored -> loadValue());
Відповісти на це запитання з ШІ-тренером
22У чому різниця між `ArrayList` та `LinkedList`?
В основі `ArrayList` лежить масив. Він забезпечує швидкий доступ за індексом, компактне розташування в пам'яті та ефективну ітерацію, але вставлення в середину вимагає зсуву елементів. `LinkedList` — це двозв'язний список. Вставлення в нього дешевше, якщо вузол уже відомий, але доступ за індексом займає O(n) часу, витрати пам'яті вищі, а локальність кешу (cache locality) гірша. У багатьох реальних застосунках `ArrayList` працює швидше, навіть якщо присутні операції вставлення.
Відповісти на це запитання з ШІ-тренером
23У чому різниця між `Comparable` та `Comparator`?
`Comparable` визначає природний порядок всередині класу за допомогою методу `compareTo`. `Comparator` — це окремий об'єкт або лямбда-вираз, який визначає зовнішній порядок. `Comparable` корисний, коли тип має один очевидний порядок за замовчуванням. `Comparator` краще підходить, коли існує кілька варіантів сортування, наприклад, за ім'ям, датою або пріоритетом. Методи `compare` та `compareTo` мають бути узгодженими і, бажано, сумісними з `equals`, якщо вони використовуються у відсортованих множинах (sorted sets) або словниках (maps).
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);
Відповісти на це запитання з ШІ-тренером