Библиотека собеса по Java | вопросы с собеседований
6.36K subscribers
442 photos
12 videos
762 links
Вопросы с собеседований по Java и ответы на них.

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
😭 Как не потратить недельный лимит AI-кодинга за три дня?

Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.

🔘 Поговорим о том:

— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре.

🔗 Зарегистрироваться на вебинар⁠
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Расскажите о паттерне Facade

Facade — это структурный паттерн, который предоставляет простой интерфейс к сложной подсистеме, скрывая внутреннюю сложность.

Простыми словами: один метод вместо десяти вызовов в разные сервисы. Пульт от телевизора — это фасад к электронике внутри.

▪️ Пример:

Оформление заказа: нужно проверить наличие, списать деньги, создать доставку, отправить уведомление. Клиент не должен знать эти детали.


// Сложная подсистема
class InventoryService {
boolean checkStock(String productId) {
return true; // проверка на складе
}
}

class PaymentService {
boolean charge(String userId, BigDecimal amount) {
return true; // списание средств
}
}

class ShippingService {
String createShipment(String orderId, String address) {
return "TRACK-" + orderId; // создание доставки
}
}

class NotificationService {
void sendOrderConfirmation(String userId, String trackingId) {
System.out.println("Уведомление отправлено: " + trackingId);
}
}

// Фасад — один метод вместо четырёх
class OrderFacade {
private final InventoryService inventory = new InventoryService();
private final PaymentService payment = new PaymentService();
private final ShippingService shipping = new ShippingService();
private final NotificationService notification = new NotificationService();

public String placeOrder(String userId, String productId,
BigDecimal amount, String address) {
if (!inventory.checkStock(productId)) {
throw new IllegalStateException("Нет на складе");
}
if (!payment.charge(userId, amount)) {
throw new IllegalStateException("Оплата не прошла");
}
String trackingId = shipping.createShipment(productId, address);
notification.sendOrderConfirmation(userId, trackingId);
return trackingId;
}
}

// Клиент вызывает один метод
OrderFacade facade = new OrderFacade();
String tracking = facade.placeOrder("user1", "SKU-100",
new BigDecimal("2999.00"), "Москва, ул. Пушкина");


▪️ Когда использовать

— Подсистема сложная, а клиенту нужен простой вход
— Хотите уменьшить связанность между слоями
— Типичный пример: сервисный слой в Spring-приложении

▪️ Минус

Фасад может стать God Object, если взять на себя слишком много логики.

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

#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Forwarded from Библиотека программиста
👀 Как вы смотрите видео?

Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?

Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.

🕰️ Опрос займёт около 3 минут.

В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.

🔗 Поделиться опытом

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему get может изменить порядок LinkedHashMap?

В map последовательно добавили ключи A, B и C. Конструктор вызван с accessOrder=true. Затем прочитали A через get. В каком порядке пойдут ключи при обходе?

Ответ:
B, C, A. В режиме access-order чтение существующего элемента считается обращением и переносит его в конец порядка обхода. Это пригодно для основы LRU-кеша. У обычного LinkedHashMap порядок задаётся вставкой, поэтому тот же get оставит A, B, C. Наличие связного порядка ещё не означает, что чтение всегда нейтрально к структуре.

Контракт LinkedHashMap

#core
❤3🔥1
Два равных объекта — две записи. В какой map это возможно?

Создали два разных объекта String со значением key. Они равны по equals, но ссылки различаются. Оба использовали как ключи. Какой размер получится у IdentityHashMap и у обычной HashMap?

Ответ:
2 и 1. IdentityHashMap сравнивает ключи по тождеству ссылок, обычная HashMap — по equals. Она нужна в редких задачах вроде обхода графа объектов или глубокой копии, где два равных по содержимому узла нельзя слить в один. Это специальная семантика, а не универсальная замена HashMap. В примере явно создаются два разных объекта, одинаковые строковые литералы для проверки не подходят.

IdentityHashMap в Java SE 25

#core
❤3
❓ Можно ли объявить интерфейс sealed и что это ограничивает?

Ответ: Да. sealed можно применять и к классам, и к интерфейсам. Для интерфейса он ограничивает круг непосредственных подтипов: кто может его реализовать или расширить.

Например, sealed interface Payment permits CardPayment, CashPayment разрешает только перечисленные непосредственные подтипы. При этом permits можно опустить, если компилятор может вывести список из объявлений в той же единице компиляции.

Обычный класс, напрямую реализующий такой интерфейс, должен быть final, sealed или non-sealed. Подынтерфейс — sealed или non-sealed. У record и enum есть собственные правила неявных модификаторов.

Важно: non-sealed снова открывает соответствующую ветку для дальнейшего наследования. Поэтому sealed у корневого интерфейса не означает, что во всей иерархии может существовать только несколько конкретных классов.

Возможность окончательно появилась в Java 17.

Документация Java

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция!

До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.

Например, можно совместить:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥

Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.

Акция действует до 31 октября включительно ⏳

⏬ Собрать свой учебный билд
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Чем ClassNotFoundException отличается от NoClassDefFoundError?

Ответ: ClassNotFoundException — проверяемое исключение, возникающее, когда приложение загружает класс по имени, например через Class.forName(), а загрузчик не находит его определение.

NoClassDefFoundError относится к LinkageError. Он может возникнуть, когда JVM требуется определение класса при обычном выполнении программы, но оно недоступно. Например, приложение скомпилировали с зависимостью, а при запуске нужный JAR отсутствует.

Но объяснение «NoClassDefFoundError всегда означает отсутствующий JAR» неполное. Он также возникает при повторной попытке инициализировать класс, чья предыдущая инициализация завершилась ошибкой.

Например, статический инициализатор выбросил исключение: первое обращение может завершиться ExceptionInInitializerError, а последующие — NoClassDefFoundError.

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

Документация Java · Дополнение 1 · Дополнение 2

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
❓ Чем операции Stream API с состоянием отличаются от операций без состояния?

Ответ: Операции без состояния обрабатывают очередной элемент независимо от ранее обработанных. Типичные примеры — filter и map, если переданные им функции сами не зависят от изменяемого внешнего состояния.

Операциям с состоянием нужна информация о других элементах. Например, distinct должен учитывать уже встреченные значения, а sorted — порядок элементов всей конечной последовательности, прежде чем выдавать отсортированный результат.

Это влияет на память и выполнение конвейера. После filter подходящий элемент часто можно сразу передать дальше. sorted обычно требует накопить данные; distinct может выдавать новые уникальные элементы постепенно.

Не путайте состояние операции Stream API с изменением общей переменной внутри лямбды. Счётчик, который вы увеличиваете из map, не превращает его в корректную замену встроенной операции с состоянием и особенно опасен при параллельном выполнении.

Документация Java

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
❓ Чем List.copyOf отличается от Collections.unmodifiableList?

Ответ: Collections.unmodifiableList(source) создаёт представление исходного списка, запрещающее изменения через это представление. Если исходный список изменить напрямую, изменения будут видны и через обёртку.

List.copyOf(source) возвращает список, который нельзя изменить и чьё содержимое не зависит от последующих изменений исходной коллекции. При этом метод не обязан физически создавать новый объект: подходящий неизменяемый список может быть переиспользован.

Например, после добавления элемента в source обёртка unmodifiableList увидит новый элемент, а результат copyOf — нет.

Есть ещё два нюанса. List.copyOf не допускает null-элементы. И ни один из этих способов не делает глубокую копию объектов внутри списка: если элемент изменяемый, его состояние всё ещё можно изменить.

List.copyOf доступен с Java 10.

Документация Java · Дополнение 1

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.

В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.

Например, можно совместить два направления по работе с ИИ:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.

А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.

Акция действует до 31 октября включительно ⏳

⏮️ Пора прокачать свой стек
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Почему orElse может вызвать функцию, даже если Optional не пуст?

Ответ: Потому что аргументы метода вычисляются до его вызова.

В выражении optional.orElse(loadDefault()) функция loadDefault() выполнится даже тогда, когда Optional уже содержит значение. Её результат будет вычислен, а затем окажется не нужен.

Это важно, если функция обращается к базе, пишет в журнал, меняет состояние или может выбросить исключение. Наличие значения в Optional не отменяет эти действия.

Для отложенного вычисления используют optional.orElseGet(() -> loadDefault()). Переданная функция будет вызвана только при пустом Optional.

При этом лень относится именно к вызову Supplier.get(). Само выражение, создающее поставщика, всё равно вычисляется заранее. Например, в orElseGet(createSupplier()) вызов createSupplier() произойдёт до входа в orElseGet.

Если значение по умолчанию уже готово и его получение не требует работы, orElse остаётся подходящим вариантом.

Документация Java

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍1
❓ Можно ли заменить collect(Collectors.toList()) на Stream.toList() без изменения поведения?

Ответ: Не всегда. Главное различие — в гарантиях для полученного списка.

Stream.toList(), появившийся в Java 16, возвращает список, который нельзя изменить: add, remove и другие операции изменения выбросят UnsupportedOperationException.

У Collectors.toList() контракт не гарантирует ни конкретный тип списка, ни возможность его изменять. Поэтому утверждение «он всегда возвращает изменяемый ArrayList» тоже неверно, даже если вы наблюдали такое поведение в используемой реализации.

Если код после сбора элементов добавляет новые значения или сортирует список на месте, механическая замена на Stream.toList() может его сломать.

Когда нужен именно изменяемый ArrayList, это стоит выразить явно: collect(Collectors.toCollection(ArrayList::new)).

И в обоих случаях сам сбор в список не создаёт глубокие копии элементов.

Документация Java · Дополнение 1

🐸 Библиотека собеса по Java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Приглашаем на Java Jam — бесплатный митап ЮMoney для бэкенд-разработчиков 🔥

✅ 29 октября, четверг, 19:00 МСК — приходите на митап в Санкт-Петербурге или смотрите трансляцию. 

Спикеры из ЮMoney и Сбера выступят с докладами:

🟣 Один апгрейд — больше сотни сервисов: как мы обновляем Java-стек в компании
Обсудим, как обновить Gradle, Spring Boot и Java в 120+ компонентах, не останавливая разработку. Расскажем, как выстраивали процессы на протяжении этого времени: от порядка действий и массовых патчей до взаимодействия с командами и решения трудностей, с которыми столкнулись во время последнего обновления.

🟣 Как я автоматизировал свой проект — и всё сломал
Разберём, как выстроить автоматизацию в проекте с помощью ИИ и какие шишки можно набить на пути. Поговорим, как работает длинный контекст в моделях и как организовать работу с учётом этих особенностей.

🟣 Откатить нельзя оставить: мониторинг выкладки релиза на основе Sentry
Ошибки случаются. Узнаем, какие из них появляются или возникают чаще после последнего релиза — и достаточно ли этого, чтобы принять решение об откате.

Зарегистрируйтесь, чтобы принять участие. Все подробности — на сайте митапа Java Jam👈
Please open Telegram to view this post
VIEW IN TELEGRAM
Делает ли final объект неизменяемым?

Ответ: Нет. Для переменной ссылочного типа final запрещает присвоить другую ссылку. Состояние самого объекта при этом может меняться. Например, в final List<String> items можно добавлять элементы, если реализация списка это разрешает. Чтобы объект был неизменяемым, нужно отдельно продумать его поля, методы и доступ к вложенным объектам. Одного модификатора final недостаточно.

Документация: final-переменные

Основа вопроса: Подборка по публичным Java-собеседованиям, темы final и immutable objects.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Гарантирует ли Future.cancel(true), что задача остановилась?

Ответ: Нет. Если задача уже выполняется и реализация поддерживает прерывание, cancel(true) пытается прервать выполняющий её поток. Но прерывание — сигнал, а не принудительная остановка. Код должен на него реагировать: проверять флаг или корректно обрабатывать InterruptedException. Успешная отмена Future не доказывает, что работа уже прекратилась. У CompletableFuture параметр mayInterruptIfRunning вообще не управляет прерыванием выполнения.

Документация: Future.cancel • Документация: CompletableFuture.cancel

Основа вопроса: Подборка по публичным Java-собеседованиям, темы Future и остановки потоков.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Запомнит ли HashMap.computeIfAbsent результат null?

Ответ: Нет. Если функция вычисления вернула null, новая запись не добавляется. При следующем вызове для того же отсутствующего ключа функция может выполниться снова. Поэтому возвращать null как признак «проверили, ничего не нашли» недостаточно для кэширования отрицательного результата. Для него нужен отдельный маркер или другой способ хранения. Если ключ уже связан со значением null, computeIfAbsent тоже пытается вычислить значение.

Документация: HashMap.computeIfAbsent

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему TreeSet может не добавить объект, который не равен существующему по equals?

Ответ: Для TreeSet совпадение определяется результатом compareTo или переданного Comparator. Если сравнение возвращает ноль, коллекция считает элементы одинаковыми. Например, компаратор только по возрасту не позволит сохранить двух разных людей одного возраста. Чтобы коллекция соблюдала обычный контракт Set, порядок сравнения должен быть согласован с equals. Если это не так, поведение остаётся определённым, но может удивить вызывающий код.

Документация: TreeSet

Основа вопроса: Подборка по публичным Java-собеседованиям, темы TreeSet и сравнения объектов.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Чем thenApply отличается от thenCompose?

Ответ: thenApply преобразует полученное значение. Если функция вернула ещё один CompletableFuture, результатом будет вложенная конструкция — future внутри future. thenCompose нужен, когда следующий шаг сам возвращает CompletionStage. Он связывает этапы и возвращает одну общую стадию с конечным результатом. Выбирайте thenApply для обычного преобразования, а thenCompose — для последовательности зависимых асинхронных операций.

Документация: CompletableFuture

Основа вопроса: Подборка по публичным Java-собеседованиям, тема CompletableFuture.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
Блокируют ли друг друга static synchronized и synchronized-метод экземпляра?

Ответ: Сами по себе — нет. Статический метод захватывает монитор объекта Class, а метод экземпляра — монитор this. Это разные блокировки, поэтому два метода могут выполняться одновременно. Если они работают с одними данными, наличие слова synchronized в обоих ещё не обеспечивает защиту. Для согласованного доступа все участники должны использовать одну и ту же блокировку.

Документация: мониторы и синхронизация

Основа вопроса: Подборка по публичным Java-собеседованиям, тема static synchronized.

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1