ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

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

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

الذهاب إلى القناة على Telegram

Вопросы с собеседований по Java и ответы на них. По рекламе: @tproger_sales_bot Учиться у нас: clc.to/3wECtA Для обратной связи: @proglibrary_feeedback_bot

إظهار المزيد
6 378
المشتركون
-624 ساعات
-197 أيام
-5130 أيام
أرشيف المشاركات
❓ Что такое событийно-ориентированная архитектура? Event-driven architecture — это когда компоненты общаются через события, не зная друг о друге напрямую.
// Событие:
public record UserRegistered(User user) {}

// Listener:
@Component
public class SendWelcomeEmail {
    @EventListener
    public void handle(UserRegistered event) {
        mailer.send(event.user().email(), "Welcome!");
    }
}

// Публикация события:
applicationContext.publishEvent(new UserRegistered(user));
Зачем ✔️ Слабая связанность — UserService не знает о SendWelcomeEmail ✔️ Легко добавить новый listener без изменения существующего кода (Open/Closed) ✔️ Можно делать асинхронные listeners — просто добавь @Async В Spring — ApplicationEventPublisher для публикации — @EventListener для подписки — @TransactionalEventListener — если нужно дождаться коммита транзакции ⚠️ Подводный камень: сложно трейсить цепочку — одно событие вызывает другое.

❓ Для чего используется ключевое слово this? this — это ссылка на текущий объект внутри его метода или конструктора. Оно нужно для: — Разрешения конфликта имён (например, между полем класса и параметром метода). — Вызова других конструкторов этого же класса. — Передачи текущего объекта в качестве аргумента в методы или конструкторы других классов. — Возврата ссылки на текущий объект (часто используется в паттерне Builder или для чейнинга методов). 🐸 Библиотека собеса по Java #core

💬 Обратная связь Текущий уровень сложности вопросов? 🔥 — Слишком просто, хочу сложнее 👍🏼 — В самый раз ❤️ — Иногда сложновато 😁 — Часто не понимаю 🐸 Библиотека собеса по Java

✔️ Java-тест: 1 запрос в коде = 10 000 запросов в БД Код чистый, тесты быстрые, на реальных данных — pg_stat_activity в огне 👇 📦 Задание — code review Ручка возвращает список заказов с информацией о товарах. Работает корректно, но DBA прибежал с графиком: каждый вызов делает тысячи запросов к БД.
@Entity
public class Order {
    @Id
    private Long id;
    private Long userId;
    private LocalDateTime createdAt;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "order")
    private List<OrderItem> items;
}

@Entity
public class OrderItem {
    @Id
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    private Order order;

    @ManyToOne(fetch = FetchType.LAZY)
    private Product product;

    private Integer quantity;
}

@RestController
@RequiredArgsConstructor
public class OrderController {

    private final OrderRepository orderRepository;

    @GetMapping("/orders")
    public List<OrderDto> getOrders(@RequestParam Long userId) {
        List<Order> orders = orderRepository.findByUserId(userId);

        return orders.stream()
            .map(order -> new OrderDto(
                order.getId(),
                order.getItems().stream()
                    .map(item -> new ItemDto(
                        item.getProduct().getName(),
                        item.getQuantity()
                    ))
                    .toList()
            ))
            .toList();
    }
}
▪️ Объясни — Точную механику N+1: где и сколько раз запросы уходят в БД в этом коде. — Почему FetchType.EAGER «решит» проблему, но создаст другую. — Как можно решить проблему. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

👩‍💻 Разработка на Java требует глубокого понимания не только языка, но и принципов работы JVM, многопоточности и современны
👩‍💻 Разработка на Java требует глубокого понимания не только языка, но и принципов работы JVM, многопоточности и современных фреймворков. 🎯 Курс «Java Developer. Professional» — это структурированное обучение для разработчиков, которые хотят выйти на новый уровень, освоить актуальный стек технологий и уверенно претендовать на позиции уровня Middle+. Вы получите 96 часов практической работы, на живых вебинарах разберете ключевые аспекты работы JVM, научитесь строить эффективные многопоточные приложения, освоите Spring WebFlux, Kafka, реактивный Postgres и Kubernetes. 📚Программа OTUS постоянно обновляется, соответствуя требованиям рынка, а диплом ценится работодателями. ➡️ Пройдите вступительное тестирование и присоединяйтесь к группе: https://clc.to/sfhRPw Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

❓ Что такое идемпотентность в REST API? Идемпотентность означает, что повторный вызов одного и того же запроса не изменяет состояние сервера более одного раза. Способы реализации: — Использовать контроль состояния (если запись уже существует, не создавать её второй раз). — Использовать HTTP методы по стандарту: GET, PUT, DELETE. Уже идемпотентны по спецификации. — Использовать уникальный ключ (идемпотентный токен) с клиентской стороны; сервер хранит, что уже получал этот токен, и при повторе не выполняет операцию заново. — В Spring → фильтры или interceptors проверяют заголовок Idempotency-Key и используют хранилище (БД, кеш) для управления повторными запросами. 🐸 Библиотека собеса по Java #core

❓ Что такое DDD? DDD (Domain-Driven Design) — подход к проектированию, при котором структура кода отражает структуру бизнес-домена. Основные строительные блоки Entity — объект с уникальной идентичностью. Два объекта с одним ID — один и тот же объект, даже если остальные поля разные. Пример: User, Order. Value Object — объект без идентичности, определяется своими атрибутами. Иммутабелен. Пример: Money(100, 'USD'), Email('alice@example.com'). Два Money(100, 'USD') — одно и то же значение. Aggregate — кластер связанных сущностей с одним корнем (Aggregate Root). Все изменения внутри агрегата — только через корень. Граница транзакции = граница агрегата. Пример: Order содержит OrderItems, но только Order — корень. Domain Service — бизнес-операция, которая не принадлежит ни одной сущности. Пример: TransferService(fromAccount, toAccount, amount). Repository — абстракция доступа к хранилищу для агрегатов. Один репозиторий — один агрегат. Domain Event — факт, произошедший в домене. OrderPlaced, PaymentFailed. Bounded Context — явная граница, внутри которой модель имеет единое значение. User в контексте Billing ≠ User в контексте Shipping. #patterns

🔴 Завтра тестовое собеседование с Java-разработчиком 1 апреля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собесед
🔴 Завтра тестовое собеседование с Java-разработчиком 1 апреля(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Виктору Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

❓ В чём разница между IO и NIO? IO (Input/Output) — это традиционная модель потоков, использующая блокирующие операции для чтения и записи данных, что может привести к задержкам, если операция занимает много времени. NIO (New IO) был введён в JDK 1.4 для улучшения производительности, предлагая неблокирующие каналы и буферы, а также поддержку асинхронных операций, что позволяет эффективно работать с большими объёмами данных или многими соединениями одновременно. 🐸 Библиотека собеса по Java #core

❓ Для чего нужен volatile? volatile — это модификатор переменной, который гарантирует: ▪️ Видимость изменений между потоками ▪️ Запрет кэширования в регистре потока Использовать стоит, когда: ▪️ Есть несколько потоков, которые читают/пишут одну переменную. ▪️ Нет сложных операций над этой переменной (например, инкрементов, которые требуют атомарности). volatile не обеспечивает атомарности, поэтому для операций «чтение-модификация-запись» нужны синхронизация или атомарные типы (AtomicInteger, AtomicReference и т.п.). 🐸 Библиотека собеса по Java #concurrency

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

😱 Если ваш продукт не умеет отдавать данные в формате, понятном AI-агенту, то вас просто не существует Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности. Как адаптировать продукт и не исчезнуть из выдачи: — интегрировать MCP и A2A-взаимодействие, чтобы агенты могли вас читать; — научиться контролировать стоимость (лимиты, кэш, роутинг между моделями); — настроить AgentOps: трейсинг, логирование и отлов регрессий. Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях. Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше. Зафиксировать цену и начать деплоить агентов без слива бюджета 👈

✔️ Java-тест: утечка в фильтре Memory leak, который живёт неделями и не воспроизводится локально 👇 📦 Задание — code review Написали фильтр для аудита запросов. В продакшне через несколько дней — OutOfMemoryError.
@Component
public class AuditFilter implements Filter {

    private static final ThreadLocal<AuditContext> CONTEXT =
        new ThreadLocal<>();

    @Override
    public void doFilter(
        ServletRequest request,
        ServletResponse response,
        FilterChain chain
    ) throws IOException, ServletException {

        AuditContext ctx = new AuditContext(
            ((HttpServletRequest) request).getRequestURI(),
            System.currentTimeMillis()
        );
        CONTEXT.set(ctx);

        try {
            chain.doFilter(request, response);
        } finally {
            auditLog(CONTEXT.get());
        }
    }

    public static AuditContext current() {
        return CONTEXT.get();
    }

    private void auditLog(AuditContext ctx) {
        // пишем в БД...
    }
}
▪️ Объясни — Почему объекты в ThreadLocal не собираются GC, даже если запрос завершён. — Какая одна строчка кода здесь отсутствует, и где именно она должна быть. * Есть ли риски при использовании ThreadLocal в virtual threads (Project Loom)? Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise

❓ Что такое ApplicationContext в Spring? ApplicationContext — это центральный интерфейс контейнера Spring, который загружает метаданные конфигурации из XML-файлов, Java-классов или аннотаций, создаёт бины и управляет ими на протяжении всего жизненного цикла приложения, а также предоставляет расширенные функции для разработки приложений. Он является расширением BeanFactory и добавляет дополнительные возможности, такие как поддержка аннотаций, автоматическое связывание зависимостей, интернационализацию и публикацию событий. 🐸 Библиотека собеса по Java #spring

❓ Как устроена под капотом HashMap? Это структура данных, основанная на хешировании, реализующая интерфейс Map. Она использует массив бакетов, где каждый элемент хранится в виде пары "ключ-значение". Основные моменты: 🔹 Хеширование: для каждого ключа вычисляется хеш-код с помощью метода hashCode(). Этот код используется для определения индекса в массиве бакетов. 🔹 Коллизии: если два разных ключа имеют одинаковый хеш-код (коллизия), они помещаются в один бакет. До Java 8 коллизии обрабатывались с помощью связанного списка, начиная с Java 8 — с помощью сбалансированных деревьев. 🔹 Динамическое расширение: когда нагрузка достигает 75% от текущего размера массива (порог загрузки), HashMap увеличивает размер массива в два раза и перераспределяет элементы, чтобы уменьшить вероятность коллизий. 🔹 Балансировка дерева: если в бакете больше 8 элементов, то список преобразуется в сбалансированное дерево, что улучшает производительность при большом количестве коллизий. 🐸 Библиотека собеса по Java

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

❓ В чём разница между Statement и PreparedStatement? — Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно. — PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно). Поэтому в реальных проектах почти всегда используют PreparedStatement. 🐸 Библиотека собеса по Java #core

❓ Что такое MVC? MVC (Model-View-Controller) — это архитектурный шаблон, разделяющий приложение на три компонента: ▪️ Model (Модель) — содержит бизнес-логику ▪️ View (Представление) — отображает данные пользователю, получая их от модели ▪️ Controller (Контроллер) — обрабатывает входные данные (обычно от пользователя), вызывает нужные методы модели и обновляет представление Этот подход упрощает сопровождение кода, позволяет разделить ответственность между слоями и облегчает тестирование. 🐸Библиотека собеса по Java #patterns

Начать рассказывать интервьюеру, как вы ловко дёргаете ручки API через базовый LangChain. Звучит как отличный план, да? Нет, это мгновенный отказ. В свежем отчёте по рынку GPU говорится, что 54% компаний стопают ИИ-внедрения тупо из-за конских затрат на инфраструктуру. На серверах более 70% стоимости — это видеокарты. Поэтому на собесах сейчас спрашивают не про красивые промпты, а про жёсткую экономику агентов. По сути, от вас ждут понимания, как лимитировать ресурсы на лету, роутить запросы и дебажить отказы через механизм time-travel в LangGraph. Если вы до сих пор собираете ботов в ноутбуках, гляньте обновлённый курс «Разработка ИИ-агентов» — фокус там смещён с игрушечных концепций на суровый энтерпрайз. Что требуют от мидлов и выше: — интеграция мультиагентных систем по стандарту MCP; — суровый AgentOps: метрики, трейсинг, защита от деградации пайплайнов; — локальный деплой Open Source под 152-ФЗ (без этого в финтех можно даже не стучаться). Прямо сейчас можно урвать курс с увесистой скидкой (49 000 ₽ 62 990 ₽ за базовый тариф и 99 000 ₽ 124 990 ₽ за продвинутый трек), но стоит поторопиться — на потоке осталось всего 5 мест. 👉 Подтянуть архитектуру до уровня прода

✔️ Java-тест: кэш убивает прод под нагрузкой Метрики норм, тесты зелёные, при пике трафика — БД ложится 👇 📦 Задание — code review Сервис отдаёт профили пользователей. Для ускорения добавили кэш на 5 минут.
@Service
@RequiredArgsConstructor
public class UserProfileService {

    private final UserRepository userRepository;
    private final RedisTemplate<String, UserProfile> redisTemplate;

    private static final Duration TTL = Duration.ofMinutes(5);

    public UserProfile getProfile(Long userId) {
        String key = "profile:" + userId;

        UserProfile cached = redisTemplate.opsForValue().get(key);
        if (cached != null) {
            return cached;
        }

        UserProfile profile = userRepository.findById(userId)
            .map(UserProfile::from)
            .orElseThrow(UserNotFoundException::new);

        redisTemplate.opsForValue().set(key, profile, TTL);
        return profile;
    }
}
▪️ Объясни — Что именно происходит при истечении TTL под нагрузкой. — Почему добавление @Cacheable над методом не спасёт ситуацию. Ставьте → 🔥, если нравится формат. Если нет → 🌚 💬 Решения под спойлер. Сравним, какое будет лучше. 🐸 Библиотека собеса по Java #practise