Библиотека собеса по Java | вопросы с собеседований
6.31K subscribers
371 photos
4 videos
287 links
Вопросы с собеседований по Java и ответы на них.

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

Учиться у нас: https://proglib.io/w/08c603b6

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Что такое функциональный интерфейс?

Функциональный интерфейс — это интерфейс с единственным абстрактным методом. Он нужен для определения целевого типа для лямбда-выражений и ссылок на методы. В Java для обозначения используется аннотация @FunctionalInterface, но она необязательна — это лишь гарантия на этапе компиляции.

Примеры: Runnable, Callable, Comparator, Function<T,R>.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое race condition?

Race condition (состояние гонки) — это ситуация, когда два или более потока или процесса одновременно пытаются получить доступ и изменить общий ресурс, и порядок их выполнения влияет на корректность программы. В результате, если доступ к ресурсу не синхронизирован, может возникнуть неконсистентное состояние, что приводит к ошибкам.

Пример:
Предположим, два потока одновременно увеличивают значение переменной. Без должной синхронизации результат может быть неверным, так как оба потока могут читать одно и то же значение до его изменения.

Как избежать:
Использование синхронизации, таких как блокировки (synchronized), атомарные операции или конструкции из библиотеки java.util.concurrent, может помочь избежать состояний гонки.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое «абсолютный путь» и «относительный путь»?

▪️ Абсолютный путь — это путь к файлу или каталогу от корневой директории файловой системы или диска. Он всегда однозначен и не зависит от текущего рабочего каталога программы.
▪️ Относительный путь — это путь к файлу или каталогу относительно текущего рабочего каталога. Он короче, но зависит от того, в какой директории запускается приложение.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие методы есть в Stream API?

В Stream API есть несколько основных категорий методов:

1. Создание потока:

stream() создаёт поток из коллекции.
of() создаёт поток из переданных элементов.
iterate() создаёт поток с элементами, вычисляемыми по определенному правилу.
generate() создаёт поток с элементами, генерируемыми функцией.

2. Промежуточные операции (возвращают новый поток):


map() преобразует элементы потока.
filter() фильтрует элементы потока.
distinct() удаляет дубликаты.
sorted() сортирует элементы.
peek() позволяет наблюдать за элементами в потоке.

3. Терминальные операции (возвращают результат, завершают поток):

collect() собирает элементы в коллекцию.
reduce() сводит элементы потока к одному значению.
forEach() выполняет действие для каждого элемента.
count() возвращает количество элементов.
anyMatch(), allMatch(), noneMatch() проверка условия для элементов.

4. Операции для работы с примитивными типами (IntStream, LongStream, DoubleStream):

mapToInt(), mapToLong(), mapToDouble() — преобразуют элементы в соответствующие типы.
sum(), average(), min(), max() — для статистики.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
В чём разница между IO и NIO в Java?

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

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

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Diamond Problem?

Diamond Problem — это ситуация в ООП, когда класс наследуется от двух (или более) классов, которые имеют общий предок. Это приводит к неясности, какой из методов или свойств из общего предка должен быть использован в дочернем классе.

Например, класс D реализует интерфейсы B и C, которые оба наследуют от A. В случае наличия однотипных методов в B и C, возникает неясность, какой метод использовать.

Java не поддерживает множественное наследование классов, поэтому Diamond Problem возникает только в контексте интерфейсов. И решается путём явного переопределения реализации в дочернем классе.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Обратная связь

Какие вопросы публиковать больше?

👍🏼 — Классика с собесов, чтобы точно набить руку на ближайший
🤔 — Вопросы, которые не встречаются в каждой статье вида "N вопросов для собеса"
🔥 — Больше практики, а то одна теория
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем различаются Thread и Runnable в Java?

Thread — это класс, который представляет поток выполнения. Вы можете создать объект Thread, передав в его конструктор объект, реализующий интерфейс Runnable, или наследовать Thread и переопределить метод run().

Runnable — это интерфейс, который представляет задачу, которую можно выполнить в потоке. Он определяет единственный метод run(), который будет содержать код, выполняемый в потоке.

Thread является более "тяжелым" объектом, так как он сам управляет жизненным циклом потока, тогда как Runnable лишь описывает задачу, а поток (например, объект Thread) управляет её выполнением.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Propagation в Spring?

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

▪️ Основные режимы:

— REQUIRED (по умолчанию): если транзакция существует, то текущий метод будет работать в рамках этой транзакции. Если транзакция не существует, создается новая.

REQUIRES_NEW: создается новая транзакция, даже если уже существует текущая. Текущая транзакция будет приостановлена до завершения новой.

— NESTED: в рамках текущей транзакции создается вложенная транзакция. В случае отката внешней транзакции будет откатана и вложенная.

MANDATORY: метод должен быть вызван в рамках существующей транзакции. Если транзакции нет, выбрасывается исключение.

— NEVER: метод не должен выполняться в рамках транзакции. Если транзакция существует, выбрасывается исключение.

SUPPORTS: если транзакция существует, метод будет выполнен в ее рамках. Если транзакции нет, метод будет выполнен без транзакции.

— NOT_SUPPORTED: метод выполняется без транзакции. Если транзакция существует, она приостанавливается на время выполнения метода.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Опишите подход Test-Driven Development

Test-Driven Development (TDD) — это методология разработки программного обеспечения, при которой сначала пишутся тесты, а затем реализуется функциональность, чтобы эти тесты прошли.

Процесс включает три основных этапа:

▪️ Красный — пишем тест, который изначально не проходит (так как функциональность еще не реализована).
▪️ Зеленый — пишем минимально необходимый код для того, чтобы тест прошел.
▪️ Рефакторинг — улучшаем код, при этом тесты должны по-прежнему проходить.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое this?

this — это ссылочная переменная, доступная внутри нестатических методов и конструкторов, которая указывает на текущий экземпляр класса.

Она используется, чтобы:

Отличать поля класса от параметров метода
Вызывать другие конструкторы текущего класса через this(...)
Передавать текущий объект в качестве аргумента
Получить доступ к текущему объекту из вложенного класса.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое optimistic и pessimistic locking?

Optimistic locking — подход, при котором предполагается, что конфликты редки. Данные читаются без блокировки, а при обновлении проверяется, что никто не изменил их параллельно (обычно через version-поле). Если данные изменились — операция отклоняется, вызывается исключение, и клиент решает, что делать дальше.

Используется, например, с JPA (@Version) и хорошо работает при низкой конкуренции.

Pessimistic locking
— подход, при котором при чтении или обновлении данных сразу накладывается блокировка, чтобы другие потоки/транзакции не могли изменить их до окончания текущей операции. Это снижает риск конфликтов, но уменьшает параллелизм.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое bytecode в Java?

Bytecode — это промежуточный машинно-независимый код, в который компилируется Java-программа. Он создаётся компилятором и сохраняется в .class файлах. Этот код не исполняется напрямую процессором, а выполняется виртуальной машиной Java (JVM), которая интерпретирует или компилирует его в машинный код на лету (через JIT-компиляцию).

Bytecode позволяет Java оставаться кроссплатформенной: один и тот же .class файл можно запускать на любой платформе с установленной JVM.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Обратная связь

Ежемесячный опрос по грейдам. Проверим, сколько среди нас джедаев синьоров.
Ваш грейд:

🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое SOLID?

SOLID — это аббревиатура из пяти принципов объектно-ориентированного проектирования, помогающих писать поддерживаемый и расширяемый код.

▪️ S — Single Responsibility Principle (SRP)
Каждый класс должен иметь одну и только одну причину для изменения.

▪️ O — Open/Closed Principle (OCP)
Сущности должны быть открыты для расширения, но закрыты для модификации.

▪️ L — Liskov Substitution Principle (LSP)
Объекты подклассов должны заменять объекты суперклассов без нарушения логики.

▪️ I — Interface Segregation Principle (ISP)
Лучше иметь несколько специализированных интерфейсов, чем один общий.

▪️ D — Dependency Inversion Principle (DIP)
Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба типа должны зависеть от абстракций.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

👉 Курс здесь
🔍 Сегодня тестовое собеседование с Java-разработчиком

2 июля(уже сегодня!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Сергею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqvFzMPV
Please open Telegram to view this post
VIEW IN TELEGRAM
В чем разница между == и .equals()?

== сравнивает ссылки на объекты, т.е. проверяет, указывают ли две переменные на один и тот же объект в памяти.

.equals() — это метод класса Object, который используется для проверки логического равенства объектов. По умолчанию метод работает как оператор ==, но многие классы (например, классы обёртки, коллекции), переопределяют его для сравнения значений объектов. В других случаях метод нужно переопределить вручную.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое денормализация в базах данных?

Денормализация — это процесс преднамеренного добавления избыточности в структуру базы данных для повышения производительности чтения. В отличие от нормализации, цель которой — устранить дублирование и обеспечить целостность, денормализация может включать дублирование данных, объединение таблиц или добавление агрегированных колонок.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
Как устроена под капотом HashMap?

Это структура данных, основанная на хешировании, реализующая интерфейс Map. Она использует массив бакетов, где каждый элемент хранится в виде пары "ключ-значение".

Основные моменты:

🔹 Хеширование: для каждого ключа вычисляется хеш-код с помощью метода hashCode(). Этот код используется для определения индекса в массиве бакетов.

🔹 Коллизии: если два разных ключа имеют одинаковый хеш-код (коллизия), они помещаются в один бакет. До Java 8 коллизии обрабатывались с помощью связанного списка, начиная с Java 8 — с помощью сбалансированных деревьев.

🔹 Динамическое расширение: когда нагрузка достигает 75% от текущего размера массива (порог загрузки), HashMap увеличивает размер массива в два раза и перераспределяет элементы, чтобы уменьшить вероятность коллизий.

🔹 Балансировка дерева: если в бакете больше 8 элементов, то список преобразуется в сбалансированное дерево, что улучшает производительность при большом количестве коллизий.

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM