Библиотека собеса по Java | вопросы с собеседований
6.48K subscribers
433 photos
11 videos
712 links
Вопросы с собеседований по Java и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: clc.to/3wECtA

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что такое type erasure и какие ограничения он накладывает на дженерики?

generics дают типобезопасность на этапе компиляции, но в рантайме информация о типовых параметрах стирается: List<String> превращается в обычный List, а компилятор сам вставляет приведения типов. Сделано ради обратной совместимости со старым кодом.

Из-за стирания нельзя:

создать new T() или new T[];
использовать instanceof List<String>;
иметь статические поля типа T;
объявить два метода, отличающиеся только параметром типа (после стирания их сигнатуры совпадут).

Частичная информация о дженериках сохраняется в сигнатурах полей и методов и доступна через рефлексию, но не на уровне конкретных экземпляров.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥1👏1
Объясните правило PECS (Producer Extends, Consumer Super)?

Это правило выбора ограниченных wildcards в дженериках.

? extends T — ковариантность, структура-«производитель»: из неё можно безопасно читать как T, но нельзя добавлять элементы, потому что компилятор не знает точный подтип.

? super T — контравариантность, структура-«потребитель»: в неё можно безопасно добавлять T и его подтипы, но при чтении вернётся только Object.

Отсюда мнемоника: если коллекция только отдаёт данные (producer) → extends; если только принимает (consumer) → super.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1👏1
Какой контракт связывает equals() и hashCode()?

Контракт: если два объекта равны по equals(), их hashCode() обязан быть одинаков. Обратное не требуется — равные хеши не означают равенство объектов (коллизии допустимы).

Если переопределить equals() и забыть про hashCode(), объект сломается в HashMap/HashSet: положили объект по одному хешу, ищем по другому, и не находим, хотя по equals() он равен.

Дополнительно equals() должен быть рефлексивным, симметричным, транзитивным и согласованным (не меняться без изменения полей).

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥1
ArrayList или LinkedList?

В подавляющем большинстве случаев → ArrayList.

ArrayList — это динамический массив: доступ по индексу O(1), вставка/удаление в середине O(n) из-за сдвига элементов. Но на практике он почти всегда быстрее за счёт локальности данных в памяти и дружбы с кешем процессора.

LinkedList — двусвязный список: вставка/удаление по уже найденной позиции O(1), но доступ по индексу O(n), и каждый элемент — отдельный объект с накладными расходами на ссылки.

LinkedList оправдан редко — например, когда нужен Deque с частыми вставками в оба конца. Для обычного списка берите ArrayList.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👏2🔥1
Чем отличаются HashMap, Hashtable и ConcurrentHashMap

HashMap — не потокобезопасен, разрешает один null-ключ и null-значения, самый быстрый в однопоточном коде.

Hashtable — legacy-класс, синхронизирован целиком: один лок на всю таблицу, поэтому в многопоточке работает медленно. Не допускает null.

ConcurrentHashMap — потокобезопасен с тонкой блокировкой: с Java 8 синхронизация идёт на уровне отдельного бакета через CAS и synchronized, что даёт высокую конкурентность. null не допускает (чтобы не путать «нет ключа» и «значение null» при гонках).

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3👏1
Чем fail-fast итераторы отличаются от fail-safe?

fail-fast (ArrayList, HashMap) бросают ConcurrentModificationException при структурном изменении коллекции во время обхода. Механизм — счётчик modCount, который итератор сверяет на каждом шаге. Это способ быстро отловить баг, а не средство защиты.

fail-safe (CopyOnWriteArrayList, ConcurrentHashMap) не бросают исключение:
- CopyOnWriteArrayList при модификации копирует внутренний массив, итератор работает со «снимком» старого состояния;
- итератор ConcurrentHashMap слабо-согласованный (weakly consistent) — отражает состояние на момент создания или позже, без жёстких гарантий.

Fail-safe безопасны в многопоточке, но итератор может не видеть свежие изменения и обходятся дороже по памяти.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍52🔥1
Чем композиция отличается от наследования?

Наследование — это отношение «is-a», поведение родителя достаётся подклассу статически на этапе компиляции. Композиция — отношение «has-a», объект делегирует работу вложенным объектам.

Проблемы наследования: сильная связанность с деталями реализации родителя (fragile base class), нарушение инкапсуляции, негибкость (только один родитель), лёгкость нарушить принцип Лисков.

Композиция более гибкая: поведение можно менять в рантайме (паттерн «Стратегия»), зависимости легко подменять в тестах, нет хрупкой иерархии. Отсюда принцип «предпочитай композицию наследованию». Наследование оправдано при настоящем «is-a» и стабильной иерархии.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1👏1
Чем List.of() отличается от Collections.unmodifiableList()?

Оба не позволяют менять список через свой интерфейс, но гарантии разные.

List.of() (Java 9) создаёт по-настоящему неизменяемую коллекцию: компактное представление, запрет на null, любая попытка модификации — UnsupportedOperationException. Менять нечего и неоткуда.

Collections.unmodifiableList() создаёт лишь обёртку-представление над существующим списком. Сама обёртка менять не даёт, но если изменить оригинальный список, изменения будут видны через обёртку. То есть это «view только для чтения», а не неизменяемая копия.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4👏1
Чем отличаются HashSet, LinkedHashSet и TreeSet?

HashSet поверх HashMap, без гарантий порядка, операции в среднем O(1). Требует корректных hashCode/equals.
LinkedHashSet сохраняет порядок вставки за счёт двусвязного списка поверх хеш-таблицы, операции O(1), но чуть больше памяти.
TreeSet основан на красно-чёрном дереве, элементы хранятся отсортированными (по Comparable или Comparator), операции O(log n). Поддерживает навигацию: first, ceiling, headSet, диапазоны.

Выбор: нужен порядок добавления — LinkedHashSet, нужна сортировка или диапазонные запросы — TreeSet, в остальных случаях — HashSet.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Что такое fail-fast итератор и как безопасно удалять элементы во время обхода?

fail-fast итератор бросает ConcurrentModificationException, если коллекцию изменили во время итерации в обход самого итератора.

Механизм: коллекция хранит счётчик modCount. Итератор запоминает его значение при создании и сверяет на каждом next(). Если структура изменилась и счётчики разошлись — бросается исключение. Это не гарантия защиты, а способ быстро отловить баг.

Чтобы безопасно удалять во время обхода:

iterator.remove();
collection.removeIf(...);
или конкурентные коллекции вроде CopyOnWriteArrayList.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1👏1
В чём разница между IO и NIO?

IO (Input/Output) — это традиционная модель потоков, использующая блокирующие операции для чтения и записи данных, что может привести к задержкам, если операция занимает много времени.

NIO (New IO) был введён в JDK 1.4 для улучшения производительности, предлагая неблокирующие каналы и буферы, а также поддержку асинхронных операций, что позволяет эффективно работать с большими объёмами данных или многими соединениями одновременно.

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👏3👍1🔥1
Что такое Autoboxing и Unboxing?

Autoboxing — автоматическое преобразование примитива в класс-обёртку (int → Integer).
Unboxing — обратное преобразование (Integer → int).

Удобно, но есть подводные камни

возможен NullPointerException при unboxing null
снижает производительность (создание объектов)
проблемы с == (сравнивает ссылки, а не значения)

🐸 Библиотека собеса по Java

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🔥1