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

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

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

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
У вас в проекте есть файл вроде utils_v2_final_FIX.py, который все боятся трогать ❓

Что делаете с таким легаси?

❤️ Не трогаю: работает — и ладно
👍 Переписываю с нуля и надеюсь на лучшее
🔥 Сначала покрываю тестами, потом рефакторю по частям
👾 У нас такого нет — честно-честно

На курсе «ИИ для разработчиков» разберём третий подход: как с помощью агента зафиксировать текущее поведение легаси-кода тестами, а затем менять его небольшими безопасными шагами — без одного огромного PR на тысячу файлов.

До 31 июля действует скидка и бессрочный доступ к материалам.

🔗 Занять место со скидкой

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
❓ Разница между Statement и PreparedStatement?

— Statement используется для выполнения простых SQL-запросов без параметров. Он формирует запрос как строку и каждый раз компилирует его заново, что может быть медленно и небезопасно.

— PreparedStatement предварительно компилируется базой данных и позволяет задавать параметры через плейсхолдеры. Что повышает производительность при многократном выполнении одного запроса и защищает от SQL-инъекций (данные не конкатенируются со строкой запроса, а подставляются корректно).

Поэтому в реальных проектах почти всегда используют PreparedStatement.

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤‍🔥1🔥1
❓ Для чего используется ключевое слово this?

this — это ссылка на текущий объект внутри его метода или конструктора. Оно нужно для:

— Разрешения конфликта имён (например, между полем класса и параметром метода).
— Вызова других конструкторов этого же класса.
— Передачи текущего объекта в качестве аргумента в методы или конструкторы других классов.
— Возврата ссылки на текущий объект (часто используется в паттерне Builder или для чейнинга методов).

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2🔥1
❓ Что такое @Qualifier и когда его использовать?

@Qualifier используется для разрешения конфликтов при внедрении зависимостей, когда существует несколько бинов одного типа.

Без @Qualifier Spring не знает, какой бин внедрить, и выбросит NoUniqueBeanDefinitionException.

@Bean
@Qualifier("primary")
public DataSource primaryDB() { ... }

@Bean
@Qualifier("secondary")
public DataSource secondaryDB() { ... }

@Autowired
@Qualifier("primary")
private DataSource dataSource;


Альтернатива — использовать @Primary для бина по умолчанию.

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

#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥1
Разработчику нужен стабильный результат, DevOps — контроль инфраструктуры, техлиду — правила для всей команды. Собрали это в одном посте 👇
🎯 У разработчика, DevOps-инженера и техлида разные причины задуматься о системной работе с AI-агентами

Но цель одна: перейти от случайных удачных запусков к управляемому процессу на реальном проекте — с понятными правилами, ревью, контролем расходов и безопасности ✔️

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

⚡️ Предзапись на осенний поток уже открыта

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Что такое нагрузочное тестирование?

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

Обычно проверяем:

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

Используем инструменты типа JMeter, Gatling или K6.

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

#tests
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3🔥1
❓ Как работает ConcurrentHashMap?

ConcurrentHashMap использует сегментирование / распространённые блокировки (в новых версиях — на уровне бакета), что позволяет нескольким потокам читать и писать без полной блокировки карты. Операции get делаются без блокировки, put и remove используют ограниченную блокировку (или CAS) лишь на отдельных сегментах или узлах.

В отличие от Collections.synchronizedMap(...), который блокирует весь объект на каждую операцию, ConcurrentHashMap даёт более высокую конкурентность и масштабируемость.

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

#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4❤2🥰1
Один доступ вместо вечного выбора между «нужно для работы» и «давно хотелось изучить» 👇
👅 Самое сложное — выбрать не курс, а направление

Сегодня хочется разобраться в AI-агентах. Через пару недель появляется задача, где нужны алгоритмы. Потом понимаешь, что неплохо бы освежить Python или математику для Data Science.

🔜 Именно поэтому подписка на обучение многим оказывается удобнее отдельных курсов. Можно спокойно переключаться между темами, когда меняются задачи, а не покупать новую программу каждый раз.

В подписку Proglib Academy входят все основные направления — AI, ML, Python, алгоритмы, математика для DS и другие курсы, а ещё закрытый видеохаб с вебинарами практиков.


Начать можно с пробного месяца. Если решите остаться, его стоимость зачтётся при оформлении подписки 😎

🔗 Узнать подробнее

🏃‍♀️ Proglib Academy
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Что такое "diamond problem" и как его решает Java?

«Diamond problem» возникает при множественном наследовании, когда класс может унаследовать одну и ту же реализацию от разных родителей.
В Java классы не поддерживают множественное наследование, а только интерфейсы позволяют такое. Если два интерфейса имеют одинаковый default-метод, то компилятор потребует явного переопределения в классе. Это и есть решение проблемы.


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

#tests
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱3👍2😁2
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