fa
Feedback
Библиотека собеса по Java | вопросы с собеседований

Библиотека собеса по Java | вопросы с собеседований

رفتن به کانال در Telegram

Вопросы с собеседований по Java и ответы на них. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/08c603b6 Для обратной связи: @proglibrary_feeedback_bot

نمایش بیشتر
6 487
مشترکین
+524 ساعت
+147 روز
+1430 روز
آرشیو پست ها
Что делает метод flatMap() в Stream API? flatMap() преобразует каждый элемент в Stream и объединяет все Stream'ы в один плоский Stream. В отличие от map() возвращает Stream<T>. Полезен для работы с вложенными коллекциями или когда операция возвращает Optional/Stream. 🐸 Библиотека собеса по Java #core

В чём разница между @Component, @Service и @Repository? Технически — никакой. Все три создают Spring bean и работают одинаково. Разница семантическая: → @Componentобщий стереотип для любого компонента.@Serviceдля бизнес-логики (service layer).@Repositoryдля работы с данными (DAO layer). @Repository имеет дополнительную функцию: перехватывает специфичные для persistence исключения и переводит их в DataAccessException. Использование правильной аннотации улучшает читаемость и показывает роль класса в архитектуре. 🐸 Библиотека собеса по Java #spring

Что такое паттерн Flyweight и где он используется в Java? Flyweight — это паттерн для экономии памяти путём переиспользования объектов с одинаковым состоянием. Объект разделяется на intrinsic state (неизменяемое, общее) и extrinsic state (изменяемое, уникальное). Общее состояние хранится в одном экземпляре. 🔹 Примеры:String Pool (все одинаковые строки ссылаются на один объект)Integer.valueOf() кеширует числа от -128 до 127Boolean.TRUE и Boolean.FALSE Паттерн эффективен, когда создаётся много объектов с повторяющимися данными. 🐸 Библиотека собеса по Java #patterns

Чем отличается invokeAll() от submit() в ExecutorService? → submit() отправляет одну задачу и сразу возвращает Future. Задача выполняется асинхронно. → invokeAll() принимает коллекцию задач и блокирует поток до завершения всех задач. Возвращает список Future только когда все задачи выполнены или вышел таймаут. 🐸 Библиотека собеса по Java #concurrency

В чём разница между CopyOnWriteArrayList и Collections.synchronizedList()? CopyOnWriteArrayList создаёт копию массива при каждой модификации. Чтение не блокируется вообще, подходит для случаев, когда чтений много, а записей мало. Collections.synchronizedList() оборачивает обычный List и синхронизирует каждый метод через монитор. Все операции (и чтение, и запись) блокируются. 🐸 Библиотека собеса по Java #concurrency

Можно ли переопределить статический метод? Нет, статические методы не переопределяются (override), они скрываются (hide). При вызове статического метода решение о том, какой метод выполнить, принимается на этапе компиляции по типу ссылки, а не по типу объекта.
class Parent {
    static void test() { System.out.println("Parent"); }
}
class Child extends Parent {
    static void test() { System.out.println("Child"); }
}

Parent obj = new Child();
obj.test(); // Выведет "Parent"
Статические методы принадлежат классу, а не объекту, поэтому полиморфизм на них не работает. 🐸 Библиотека собеса по Java #core

«Этот манёвр будет стоить нам 51 год...» — или проваленный тех-скрининг из-за незнания паттернов проектирования. В Java энтер
«Этот манёвр будет стоить нам 51 год...» — или проваленный тех-скрининг из-за незнания паттернов проектирования. В Java энтерпрайзе архитектура — это всё. Не ждите, пока гравитация рынка прижмёт вас к зарплатному потолку, вкачивайте базу. С понедельника цены в Proglib Academy станут выше. Забирайте профессиональное обучение сейчас: — Разработка ИИ-агентов — Математика для разработки AI-моделей — ML для старта в Data Science — Математика для Data Science — Специалист по ИИ — Алгоритмы и структуры данных — Программирование на Python — Основы IT для непрограммистов — Архитектуры и шаблоны проектирования Стать сильнее на интервью ⚠️ Цены вырастут 19 января

Что такое Happens-Before отношение? Happens-Before — это гарантия видимости изменений между потоками в Java Memory Model. Если действие A happens-before действия B, то все изменения памяти, сделанные в A, будут видны в B. Примеры правил: — разблокировка монитора happens-before следующей блокировки того же монитора.запись в volatile поле happens-before чтения из него.завершение потока happens-before join() на этом потоке. Это фундаментальная концепция для понимания многопоточности в Java. 🐸 Библиотека собеса по Java #concurrency

В чём разница между Comparable и Comparator? Comparable — это интерфейс для естественной сортировки объекта. Реализуется самим классом через метод compareTo(). Определяет одну стандартную логику сравнения. Comparator — это внешний интерфейс для кастомной сортировки. Можно создать множество разных компараторов для одного класса, не меняя его код. Comparable используется, когда есть очевидный способ сортировки (например, числа по возрастанию). Comparator — когда нужны разные варианты (по имени, по дате, по цене). 🐸 Библиотека собеса по Java #core

Как и где Spring ищет бины? Spring ищет бины с помощью сканирования классов в указанных пакетах, используя аннотации (@Component, @Service, @Repository, @Controller и кастомные с @Component внутри). Сканирование начинается с пакета, переданного в @ComponentScan или (по умолчанию) из того, где находится @SpringBootApplication (которая включает @ComponentScan). Если бин не помечен аннотацией, его можно зарегистрировать вручную через @Bean в @Configuration-классе, BeanDefinitionRegistry или XML-конфиг. 🐸 Библиотека собеса по Java #spring

Что такое JIT-компилятор? JIT (Just-In-Time) компилятор — это компонент JVM, который компилирует байт-код в машинный код непосредственно во время выполнения программы, а не до старта приложения. Его задача — улучшить производительность, оптимизируя код, исходя из реальных условий работы программы. JIT компилирует только те части кода, которые реально исполняются, и может применять различные оптимизации для ускорения работы приложения. Это позволяет сочетать гибкость интерпретируемого байт-кода и производительность нативного кода. 🐸 Библиотека собеса по Java #core

Какие существуют состояния потока? Thread может находиться в одном из следующих состояний (Thread.State): 1️⃣ NEW — поток создан, но еще не запущен. 2️⃣ RUNNABLE — поток готов к выполнению, но может ожидать процессорное время. 3️⃣ BLOCKED — поток ждет освобождения монитора для входа в synchronized блок. 4️⃣ WAITING — поток ожидает сигнал без тайм-аута. 5️⃣ TIMED_WAITING — поток ожидает, но с ограничением по времени. 6️⃣ TERMINATED — поток завершил выполнение. 🐸 Библиотека собеса по Java #concurrency #лучшее2025

Что такое микросервисы? Микросервисы — это архитектурный стиль, при котором приложение разбивается на небольшие, независимые сервисы. Каждый сервис отвечает за определённую бизнес-логику, имеет собственную базу данных (или логически обособленное хранилище) и взаимодействует с другими сервисами через API (обычно REST или gRPC). 🔹 Ключевые принципыМожно обновлять и масштабировать отдельные сервисы без затрагивания всей системы.Каждый сервис выполняет свою узкую задачу.У сервиса свои изолированные данные, код и зависимости.Сервисы общаются через HTTP, AMQP, Kafka и другие механизмы. 🐸 Библиотека собеса по Java #patterns #лучшее2025

Что такое Dependency Injection? Dependency Injection (внедрение зависимостей) — это один из основных паттернов проектирования в программировании, который позволяет объектам получать свои зависимости извне, вместо того чтобы создавать их внутри себя. DI способствует:Слабой связанности между компонентами.Легкости тестирования за счет использования mock-объектов.Повторному использованию кода. Основные способы внедрения зависимостей в Spring: 🔹 Constructor Injection Зависимости передаются через конструктор.
public class Service {
    private final Repository repository;

    public Service(Repository repository) {
        this.repository = repository;
    }
}
🔹Setter Injection Зависимости передаются через сеттеры.
public class Service {
    private Repository repository;

    public void setRepository(Repository repository) {
        this.repository = repository;
    }
}
🔹 Field Injection Зависимости внедряются напрямую в поля класса (обычно с помощью фреймворков, например Spring).
@Component
public class Service {
    @Autowired
    private Repository repository;
}
#patterns 🐸 Библиотека собеса по Java

💬 Обратная связь Первый опрос по грейдам в этом году. Ваш грейд: 🔥 — Senior 👍🏼 — Middle ❤️ — Junior 😁 — Ещё учусь 🐸 Библиотека собеса по Java

Как бы вы оптимизировали запрос с JOIN?Создание индексы на колонках, которые используются для соединений. Это ускорит поиск строк, особенно если соединяемые таблицы большие.Если возможно, уменьшить размер данных, участвующих в соединении. Для этого можно использовать подзапросы или фильтровать данные до соединения.Использование правильного типа JOIN.EXPLAIN для анализа выполнения запроса и выявления узких мест. Это покажет, как именно СУБД обрабатывает запрос и на каких этапах происходят замедления.Если запросы с JOIN используются часто, создать материализованные представления для хранения результатов, что снизит нагрузку на базу данных при повторных обращениях.Рассмотреть варианты изменения структуры БД (например, денормализация). 🐸 Библиотека собеса по Java #core #лучшее2025

Что такое авторизация и аутентификация? ▪️ Аутентификация — процесс проверки подлинности субъекта (пользователя или системы) на основе предоставленных им учетных данных (например, пары логин/пароль, сертификата или токена). Она подтверждает, что субъект является тем, за кого себя выдаёт. ▪️Авторизация — процесс определения прав и привилегий аутентифицированного субъекта в рамках определённой системы или ресурса. Она определяет, какие действия или ресурсы доступны субъекту после успешной аутентификации. Аутентификация устанавливает личность субъекта, а авторизация — его полномочия в системе. 🐸 Библиотека собеса по Java #core #лучшее2025

Какие бывают гарантии доставки сообщений в Kafka? В Kafka существует три уровня гарантий доставки сообщений: 1️⃣ At most once (максимум один раз) Сообщение может быть потеряно, но никогда не будет обработано дважды. Producer отправляет сообщение и не ждет подтверждения (acks=0). Самый быстрый, но ненадежный вариант. 2️⃣ At least once (минимум один раз) Сообщение гарантированно доставлено, но может быть обработано несколько раз. Producer ждет подтверждения от лидера (acks=1) или всех реплик (acks=all). При повторной отправке возможны дубликаты. Используется чаще всего. 3️⃣ Exactly once (ровно один раз) Сообщение доставляется и обрабатывается строго один раз. Достигается через idempotent producer (enable.idempotence=true) и транзакции. Самый надежный, но с небольшим оверхедом по производительности. Выбор зависит от задачи: для логов подойдет at most once, для финансовых операций — exactly once, для большинства случаев — at least once с идемпотентной обработкой. 🐸 Библиотека собеса по Java #core #лучшее2025

👀 Задача: Разработка высоконагруженного сервиса кеширования (middle+) В компании возникла необходимость повысить производите
+1
👀 Задача: Разработка высоконагруженного сервиса кеширования (middle+) В компании возникла необходимость повысить производительность системы за счёт внедрения распределённого кеша. Ваша задача — спроектировать и реализовать высоконагруженный сервис кеширования, обеспечивающий быструю и надёжную работу в условиях интенсивного использования. ▪️ Условия: 1. Высокая доступность: сервис должен быть устойчив к сбоям и обеспечивать непрерывную работу. 2. Масштабируемость: возможность горизонтального масштабирования для обработки увеличивающегося объёма данных. 3. Консистентность данных: обеспечение согласованности данных между узлами кеша. 4. Управление устареванием: реализация механизма автоматического удаления устаревших данных из кеша. 💡 Ключевые моменты: — Выбор технологии: определение подходящего решения для распределённого кеширования (например, Redis, Memcached или собственная реализация). — Репликация и шардирование: обеспечение надёжности и производительности через распределение данных и их дублирование. — Алгоритмы замещения: выбор и реализация стратегий удаления устаревших или редко используемых данных (например, LRU, LFU). ✔️ Решение: Использовать Redis в режиме кластеризации для обеспечения распределённого хранения данных. Настроить репликацию для повышения отказоустойчивости и реализовать механизм шардирования для равномерного распределения нагрузки. Применить алгоритм LRU (Least Recently Used) для автоматического удаления устаревших данных. Внедрить системы мониторинга (например, Prometheus) и логирования для оперативного отслеживания состояния кеша и быстрого реагирования на возможные проблемы. Реализация на картинке 👆🏻 #лучшее2025