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

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Что такое Spring Bean?

Неверно: Весенняя фасоль

✔️ Правильный ответ: Spring Bean — это объект, управляемый контейнером Spring IoC (Inversion of Control). Бины представляют собой ключевые компоненты приложения, которые создаются, настраиваются и управляются Spring Framework.

🛠 Основные характеристики Spring Bean:

- Управление жизненным циклом:
Контейнер отвечает за создание, инициализацию и уничтожение бина.

- Конфигурация:
Бины можно определять с помощью аннотаций (
@Component, @Service, @Repository, @Bean) или XML-конфигурации.
- Инъекция зависимостей (DI):
Контейнер автоматически внедряет зависимости, требуемые для работы бина.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎅 Какой подарок вы бы хотели на НГ? Пишите в комментариях👇

Админ на НГ не отказался бы от вашей активности. Реакции, комментарии, конструктивные предложения будем ждать под ёлкой 🎄
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу

→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения

Для заказа пишите сюда: @proglib_adv
💡 Как избежать катастрофы при переходе на PostgreSQL: руководство по спасению базы данных

Переход на PostgreSQL — это не просто замена одного инструмента другим. Неправильный подход может привести к потере данных, снижению производительности и длительным простоям. Особенно это касается хранимых процедур: различия между PL/pgSQL и языками, такими как PL/SQL или T-SQL, могут вызывать ошибки, которые сложно обнаружить заранее.

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

🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое phantom reads в контексте работы с БД?

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

📌 Пример:

- Транзакция A выполняет запрос: SELECT * FROM orders WHERE amount > 100;
- В это время транзакция B добавляет новую запись: INSERT INTO orders (id, amount) VALUES (10, 150); и фиксирует изменения (COMMIT).
- Транзакция A повторяет свой запрос: SELECT * FROM orders WHERE amount > 100;
- Теперь в результате запроса появляется новая запись с id = 10, которая не была видна в первой выборке.


Фантомные чтения возможны на уровнях изоляции ниже SERIALIZABLE. Уровень REPEATABLE READ защищает от dirty и non-repeatable reads, но не от фантомных. Только уровень SERIALIZABLE гарантирует полную консистентность, исключая фантомные чтения за счёт блокировки или иного способа предотвращения изменений в диапазонах данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Розыгрыш от Proglib Academy и DigitalRazor!

С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!

🎁 Призы для участников акции:

Игровой ПК DigitalRazor ProGaming
VIP-пакет курса Proglib Academy

💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.

Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.

📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.

Выбрать курс
Что такое область видимости (scope) бина в Spring?

Область видимости в Spring определяет жизненный цикл и видимость бинов в контейнере IoC. Основные области видимости:

- Singleton (по умолчанию):
Один экземпляр бина создаётся на весь контекст Spring. Используется для общих объектов.

- Prototype:

Каждый запрос к контейнеру создаёт новый экземпляр бина.

- Request:
Бин создаётся для каждого HTTP-запроса (только в веб-приложениях).

- Session:
Один бин создаётся на одну HTTP-сессию.

- Application:
Один бин на весь жизненный цикл ServletContext.

- WebSocket:
Один бин на WebSocket-сессию.

Для указания области видимости используется аннотация @Scope.
Please open Telegram to view this post
VIEW IN TELEGRAM
🏢📊 Как сократить расходы на инфраструктуру в 20 раз: опыт внедрения мультитенантной архитектуры

Снизить затраты на инфраструктуру в десятки раз — не фантастика, а реальность. Мультитенантная архитектура помогает не только экономить деньги, но и упрощает подключение новых клиентов, масштабирование и обслуживание системы. Такой подход значительно облегчает работу и открывает новые возможности для роста.

Хотите узнать, как правильно её внедрить, избежать типичных ошибок и достичь впечатляющих результатов? Ознакомьтесь с реальным опытом, который вдохновит на изменения. 🍹

🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое optimistic и pessimistic locking?

🔹 Optimistic Locking использует версионный контроль. Каждый объект данных имеет поле версии (@Version в JPA), которое обновляется при изменении. При сохранении проверяется, что версия не изменилась. Если она изменилась (другая транзакция уже обновила объект), операция завершается с ошибкой. Это подход минимально блокирует ресурсы, но требует обработки конфликтов на уровне приложения.

🔹 Pessimistic Locking заключается в блокировке строк для предотвращения их изменения другими транзакциями. Существует три вида блокировок в JPA:

PESSIMISTIC_READ – другие транзакции могут читать, но не изменять данные.
PESSIMISTIC_WRITE – блокировка на запись, другие транзакции не могут читать и изменять данные.
PESSIMISTIC_FORCE_INCREMENT – аналогично WRITE, но увеличивает версию даже без изменений.

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

- Optimistic Locking подходит для систем с редкими конфликтами.
- Pessimistic Locking лучше использовать в сценариях с высокой конкуренцией или при необходимости строго гарантировать целостность данных.
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Обратная связь

По возможности вопросы выбираются с приближением к реальным собеседованиям или чему-то применимому в целом. А не вопросы вида "зачем мне это, что это вообще такое, никогда не задумывался об этом и не буду". Как вам кажется, удаётся это или нет?

Поставьте реакцию — каждый отзыв очень важен. Также можете в комментариях поделиться своим мнением, что можно улучшить. Сделаем контент интереснее вместе.

🔥 - Всё супер, админ красавчик
👍🏼 - Хорошо, большинство вопросов интересны/полезны
🤔 - Удовлетворительно, не все вопросы полезны/интересны
😢 - Что-то не нравится, напишу в комментариях, что именно
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Что такое "Проблема бриллианта" (Diamond Problem)?

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

В Java множественное наследование классов не поддерживается, но проблема все равно может возникнуть при использовании интерфейсов.

interface A {
void method();
}

interface B extends A {
@Override
default void method() {
System.out.println("Method from B");
}
}

interface C extends A {
@Override
default void method() {
System.out.println("Method from C");
}
}

class D implements B, C { }

public class Main {
public static void main(String[] args) {
D d = new D();
d.method(); // Какая версия метода будет вызвана?
}
}


📌 В чем суть проблемы?

Когда класс D реализует оба интерфейса B и C, которые оба предоставляют дефолтные реализации метода method(), возникает неопределенность — какую версию метода должен использовать класс D? При компиляции будет выброшен error: class D inherits unrelated defaults for method() from types B and C.

Это решается с помощью явного переопределения метода в классе D, что позволяет избежать конфликтов.

class D implements B, C {
@Override
public void method() {
B.super.method();
// или можно использовать C.super.method(), если хотите вызвать метод из C
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👀 Задачи с собеседований: Числа от 0 до 1000, которые делятся на 3, но не на 5, и сумма цифр которых меньше десяти (jun+)

— Как найти все числа от 0 до 1000, которые одновременно:
Делятся на 3.
Не делятся на 5.
Сумма цифр числа меньше десяти.

💡 Ключевые моменты:

- Чтобы число делилось на X, его нужно проверить на остаток от деления: number % Х == 0.
- Для проверки суммы цифр числа можно пройтись по всем его цифрам и сложить их, затем проверить, что сумма меньше 10.
- Как улучшить решение?

Реализация на картинке 👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно ли все методы в классе пометить как synchronized?

Неверно: Да, пометить весь класс как synchronized

✔️ Правильный ответ: Да, однако весь класс пометить как synchronized нельзя. Ключевое слово synchronized применяется только к методам или блокам кода внутри класса. Если необходимо синхронизировать доступ ко всем методам класса, это придется сделать вручную, добавляя synchronized к каждому методу.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие преимущества и подводные камни могут возникнуть при использовании @Data из Lombok?

🔹 Преимущества:

- Автоматически генерирует getter/setter, toString, equals, hashCode и constructor.
- Меньше шаблонного кода, больше концентрации на бизнес-логике.

🔹 Подводные камни:

- Потенциальная рекурсия в toString для связанных объектов.
- Автоматическая генерация всех методов может включить ненужные поля, что негативно скажется на производительности или логике.
- Небезопасно для JPA-сущностей: можно включить ленивые поля в equals или hashCode.

Рекомендация: Используйте @Data для DTO или простых классов, а для сущностей JPA применяйте аннотации @Getter, @Setter и выборочные настройки вручную.
Please open Telegram to view this post
VIEW IN TELEGRAM
Какие архитектурные паттерны проектирования есть и кратко опишите?

Layered Pattern — деление системы на слои: представление, бизнес-логика, доступ к данным.
Клиент-Сервер — разделение системы на клиентов, которые запрашивают услуги, и серверов, которые их предоставляют.
Микросервисы — деление системы на независимые сервисы, которые можно разворачивать отдельно.
Event-Driven Architecture (Событийно-ориентированная архитектура) — система реагирует на события и запускает процессы.
MVC, MVP, MVVM — разделение данных, пользовательского интерфейса и логики обработки.
SOA (Сервис-Ориентированная Архитектура) — приложения строятся из повторно используемых сервисов.
P2P — каждый узел системы является и клиентом, и сервером.
Брокер — использование посредника для управления коммуникациями между компонентами.
Гексагональная архитектура — изоляция основной логики от внешних систем через адаптеры.
CQRS — разделение операций на чтение и запись для оптимизации.
Pipe-and-Filter — обработка данных через серию шагов, соединённых трубами.
Cloud-Native — архитектура, оптимизированная для облака с микросервисами и контейнерами.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Что такое method hiding?

Method hiding — это механизм, при котором статический метод суперкласса "скрывается" статическим методом с той же сигнатурой в подклассе. Это не переопределение, а скрытие.

🔹 Как это работает:

- Тип метода определяется на этапе компиляции, основываясь на типе ссылки.
- Если ссылка относится к суперклассу, вызывается метод суперкласса. Если к подклассу — метод подкласса.

🔹 Пример:

class Parent {
static void show() {
System.out.println("Parent static method");
}
}

class Child extends Parent {
static void show() {
System.out.println("Child static method");
}
}

Parent parent = new Child();
parent.show(); // Выведет "Parent static method"


⚠️ Это не работает для нестатических методов — там всегда используется переопределение, а метод определяется во время выполнения (runtime).
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое маркерный интерфейс?

Маркерный интерфейс — это интерфейс без методов и полей, служащий для передачи дополнительной метаинформации классу. Примеры в Java — Serializable и Cloneable. Они сигнализируют JVM или библиотекам о том, как работать с объектами этих классов. Например, Serializable указывает, что объект может быть сериализован.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Что такое динамическое связывание?

Динамическое связывание — это процесс, при котором вызов метода определяется во время выполнения программы, а не на этапе компиляции. Это возможно благодаря механизму полиморфизма.
Например, если метод переопределён в классе-наследнике, JVM решает, какую версию метода вызывать (из родительского или дочернего класса), только во время выполнения. Или когда объект создаётся на основе интерфейса, вызов метода также определяется динамически.

📌 Пример:

class Animal {
void sound() { System.out.println("Animal sound"); }
}

class Dog extends Animal {
@Override
void sound() { System.out.println("Bark"); }
}

Animal animal = new Dog();
animal.sound(); // Вывод: Bark


В этом коде тип переменной animal определён на этапе компиляции (Animal), но метод sound() вызывается из Dog, потому что объект определяется динамически во время выполнения.
Please open Telegram to view this post
VIEW IN TELEGRAM
Подготовься к собеседованию на позицию Data Scientist!

Профессия Data Scientist становится все более востребованной, и компании ищут специалистов, способных превращать данные в ценные инсайты. Но как успешно пройти техническое собеседование?

Мы собрали 10 типичных задач, которые могут встретиться на собеседовании, и эффективные подходы к их решению:

1. Внешнее и тензорное произведение

2. One-hot кодировка

3. Мониторинг осадков

4. Симуляция бросков кубиков в «Монополии»

5. Бурение скважин для добычи золота

6. Вычисление свертки

7. Бэктестинг торговой стратегии

8. Прогноз оттока клиентов с помощью логистической регрессии

9. Обнаружение спама с использованием дерева решений

10. Предсказание цен на квартиры с помощью линейной регрессии

Чтобы начать решать задачи, достаточно ответить на четыре простых вопроса по этой ссылке и получить доступ к вводным занятиям курса Математика для Data Science и 10 задачам.