Java Backend | YeaHub – Telegram
Java Backend | YeaHub
908 subscribers
236 photos
28 videos
3 files
412 links
Теория, подготовка к интервью и курсы для Java разработчиков

YeaHub — это платформа для IT-специалистов, объединяющая обучение, карьерный рост, развитие и сообщество единомышленников.

Платформа: https://yeahub.ru

Для связи: @ruslan_kuyanets
Download Telegram
#Собес #pojo #class #oop
🤔 Что такое класс POJO? Приведите пример такого класса.

💬 Кратко:

POJO (Plain Old Java Object) — это простой Java-класс без сложных зависимостей. Он используется для хранения данных и не содержит бизнес-логики.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #java #sql #microservices

🤔 Middle Java Backend разработчик в компанию Билайн

Техническое собеседование. Лето 2024. Вилка: 250к+. Проект: обещанный платеж. Опыт в резюме: 3 года.

💬 Вопросы:

- Какие механизмы аутентификации и авторизации применяются в микросервисной архитектуре (например, через Spring Security)?

- Что такое миграции баз данных и какие инструменты применяются для их реализации?

- Какие существуют подходы к обработке исключений в Java? В чём отличие обработки через try/catch от предварительной проверки условий?

- Какие механизмы асинхронного программирования есть в Java (например, CompletableFuture) и как они применяются?

- В чём преимущества и недостатки написания SQL-запросов вручную по сравнению с использованием ORM (например, Hibernate)?

👉 Все вопросы из этого собеседования (21)

📣 Хочешь больше собесов?
Подпишись на наш главный канал
2
#course #ооп #алгоритмы
📚 Бесплатный открытый онлайн-курс Хельсинкского университета

Бесплатный открытый онлайн-курс Хельсинкского университета (МООК) по объектно-ориентированному программированию на Java на английском языке. Курс затрагивает основы компьютерного программирования, а также алгоритмы и основы ООП, содержит много упражнений и подходит для обучения с нуля.

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #lock #concurrency
🤔 Как сделать потокобезопасную структуру данных для блокировки по определённому ID?

💬 Кратко:

Используйте ConcurrentHashMap с ReentrantLock или synchronized:
Map<Long, Lock> locks = new ConcurrentHashMap<>();
Lock lock = locks.computeIfAbsent(id, k -> new ReentrantLock());
lock.lock();
try {
// Критическая секция
} finally {
lock.unlock();
}


📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
Maven vs npm/pnpm: Битва менеджеров зависимостей

Привет, коллеги! 👋

Сегодня на примере моего стека (Java/Spring и NestJS) сравним менеджеры зависимостей.

Maven (Java)

Как работает:
- Файл конфигурации pom.xml
- Скачивание зависимостей в локальный кэш (`~/.m2/repository`)
- Жесткая версионность
- Плагины для сборки, тестирования, деплоя

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>


Особенности:
- Стабильность и предсказуемость
- Единые версии зависимостей для всех разработчиков
- Медленная загрузка зависимостей
- Сложная настройка кастомных сборочных процессов

npm/pnpm (NestJS)

Как работает:
- Файл package.json с семантическим версионированием
- node_modules для хранения зависимостей
- npm — стандартный менеджер
- pnpm — альтернатива с жесткими ссылками

{
"dependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/core": "^10.0.0"
}
}


Особенности:
- Гибкое версионирование (^, ~, *)
- Быстрая установка (особенно в pnpm)
- Риск конфликта версий
- package-lock.json`/`pnpm-lock.yaml для фиксации версий

#### Сравнение производительности

Скорость установки:
- pnpm — самый быстрый за счет жестких ссылок
- npm — значительно улучшил скорость в последних версиях
- Maven — самый медленный, но стабильный

Надежность:
- Maven — строгая версионность минимизирует риски
- npm/pnpm — lock-файлы решают проблему "у меня работает", но требуют дисциплины

Выводы

Maven выбирают для enterprise-проектов, где важна стабильность. npm/pnpm предпочтительнее для быстрой разработки и CI/CD.

В моем ed-tech проекте использую pnpm за скорость, на работе — Maven за надежность.

А какие инструменты используете вы? Сталкивались с проблемами зависимостей?

#maven #npm #pnpm #java #nestjs #dependencymanagement #ci_cd
1❤‍🔥1🔥1🤝1
#Собес #string #stringbuffer #stringbuilder
🤔 Какая разница между String, StringBuffer и StringBuilder?

💬 Кратко:

- String — неизменяемый класс, каждый раз при изменении строки создается новый объект.
- StringBuffer — изменяемый класс, потокобезопасен, но менее эффективен, чем StringBuilder.
- StringBuilder — изменяемый класс, не является потокобезопасным, но более эффективен в однопоточных приложениях.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
2🔥1🤝1
#Собес #docker_client #docker_host #docker_registry
🤔 Перечислите компоненты Docker.

💬 Кратко:

Docker состоит из трех основных компонентов: Docker Client, Docker Host и Docker Registry. Docker Client взаимодействует с Docker Host, отправляя команды для управления контейнерами, Docker Host управляет контейнерами и их образами, а Docker Registry хранит образы Docker.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
#book #практика
📚 Java Concurrency на практике

Стандарт в разработке. Книга, которая даст вам прочную базу в Java-разработке и поможет изучить непростую тему потокобезопасности. Возможно, книга немного устарела, ей уже много лет. Но погрузиться с ней в основы получится отлично. Ведь книга описывает типичные ошибки написания конкурентных приложений на Java и распространённые ошибки с многопоточностью.

Перейти к материалу

👉 База вопросов 👉 Новости
1
#Собес #docker #java #deploy
🤔 Как осуществляется контейнеризация Java-приложений с помощью Docker?

💬 Кратко:

Java-приложение можно контейнеризовать, создав Dockerfile, в котором указывается базовый образ с JDK или JRE, копируется jar-файл и прописывается команда запуска. Это позволяет запускать приложение изолированно, независимо от настроек окружения. Основные шаги — сборка jar-файла, написание Dockerfile и сборка образа с помощью команды docker build.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
#Собес #junit5 #testng #mockito
🤔 Какие фреймворки используются для тестирования на Java?

💬 Кратко:

Основные: JUnit 5 для юнит-тестов, TestNG как альтернатива. Mockito (и его расширения — Spring MockK, MockBean) для создания заглушек и моков. Для интеграционных тестов Spring Boot Test, DBUnit, WireMock для эмуляции HTTP/REST сервисов и Testcontainers для поднятия тестовой инфраструктуры (БД, Kafka, Redis) в Docker.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
1
ArrayList vs LinkedList: что выбрать на практике? 🎯

Привет, коллеги! 👋

Сегодня начинаем серию постов про вопросы с собеседований! Будем разбирать самые частые темы, которые действительно спрашивают в IT-компаниях.

Первый на очереди — вечный спор: ArrayList vs LinkedList.

Ключевые различия

ArrayList:
- Основан на массиве
- Быстрый доступ по индексу O(1)
- Медленная вставка/удаление в середине O(n)
- Оптимизирован под чтение

LinkedList:
- Двусвязный список
- Медленный доступ по индексу O(n)
- Быстрая вставка/удаление в середине O(1)
- Оптимизирован под модификации

Практический пример

// ArrayList - быстрое чтение
List<String> arrayList = new ArrayList<>();
arrayList.get(1000); // Мгновенно

// LinkedList - быстрое изменение
List<String> linkedList = new LinkedList<>();
linkedList.add(0, "new element"); // Быстро


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

ArrayList:
- Частое чтение по индексу
- Итерация по элементам
- Предсказуемый размер данных

LinkedList:
- Частые вставки/удаления в начале/середине
- Реализация очередей (Queue/Deque)
- Динамически изменяемые данные

Бенчмарк на реальных операциях

// Вставка в начало
arrayList.add(0, "new"); // O(n) - медленно
linkedList.addFirst("new"); // O(1) - быстро

// Доступ по индексу
arrayList.get(1000); // O(1) - быстро
linkedList.get(1000); // O(n) - медленно


Выводы

В 95% случаев выбирайте ArrayList — он эффективнее по памяти и быстрее для большинства операций.

LinkedList используйте только для специфических сценариев с частыми модификациями в середине списка.

Следующий в серии — HashMap vs ConcurrentHashMap! Ждите скоро

А вы часто используете LinkedList в своих проектах? Делитесь опытом в комментариях! 👇

#java #interview #arraylist #linkedlist #collections
5👍1🔥1
#Собес #mac #address #ip
🤔 В чём разница между IP и MAC адресацией?

💬 Кратко:

MAC — уникальный идентификатор сетевого интерфейса на канальном уровне. IP — логический адрес, используемый для маршрутизации в интернете.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
👍1🔥1
#podcast #всё
📚 Подкасты Y_LAB

Здесь вы найдете разнообразный IT-контент: от глубоких технических обсуждений до увлекательных и расслабляющих бесед. Наши эпизоды охватывают широкий спектр тем, связанных с разработкой и новейшими технологиями, чтобы каждый разработчик нашел что-то для себя. Присоединяйтесь к нам, чтобы углубить свои знания, оставаться в тренде и вдохновляться новыми идеями!

Перейти к материалу

👉 База вопросов 👉 Новости
#Собес #factory #builder #pattern
🤔 В чём разница между фабричным методом и билдером?

💬 Кратко:

- Фабричный метод: Создаёт объекты одного типа через подклассы.
- Билдер: Пошагово конструирует сложные объекты (например, с множеством полей).

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
Optional: как правильно бороться с NPE? 🛡️

Привет, коллеги! 👋

Сегодня разбираем Optional — современный способ борьбы с NullPointerException.

Зачем нужен Optional?

Раньше:
public String getUserName(User user) {
if (user != null) {
return user.getName();
}
return null; // Риск NPE
}


Сейчас:
public Optional<String> getUserName(User user) {
return Optional.ofNullable(user)
.map(User::getName);
}


Создание Optional

// Пустой Optional
Optional<String> empty = Optional.empty();

// Optional с гарантированно не-null значением
Optional<String> nonNull = Optional.of("hello");

// Optional с возможным null
Optional<String> nullable = Optional.ofNullable(getName());


Основные методы

Проверка наличия значения:
Optional<String> opt = Optional.of("hello");

if (opt.isPresent()) { // Проверка
String value = opt.get(); // Получение (опасно!)
}

opt.ifPresent(value -> { // Безопасное выполнение
System.out.println(value);
});


Извлечение значений:
Optional<String> opt = Optional.ofNullable(getName());

// Значение по умолчанию
String result1 = opt.orElse("default");

// Вычисляемое значение по умолчанию
String result2 = opt.orElseGet(() -> generateDefault());

// Исключение, если значения нет
String result3 = opt.orElseThrow(() -> new RuntimeException("Not found"));


Цепочки вызовов с map() и flatMap()

class User {
private Address address;
// getters
}

class Address {
private String street;
// getters
}

// Без Optional (ужас вложенных проверок)
public String getStreet(User user) {
if (user != null) {
Address address = user.getAddress();
if (address != null) {
return address.getStreet();
}
}
return null;
}

// С Optional (элегантно!)
public String getStreet(User user) {
return Optional.ofNullable(user)
.map(User::getAddress)
.map(Address::getStreet)
.orElse("Unknown street");
}


Фильтрация и преобразование

Optional<User> userOpt = findUserById(1);

// Фильтрация
Optional<User> adultUser = userOpt
.filter(user -> user.getAge() >= 18);

// Преобразование
Optional<String> userName = userOpt
.map(User::getName)
.filter(name -> name.length() > 3);


Правила использования

Правильно:
// Как возвращаемое значение
public Optional<User> findUser(int id) {
return Optional.ofNullable(userRepository.findById(id));
}

// Для безопасной обработки цепочек
public void processUser(int id) {
findUser(id)
.map(User::getName)
.ifPresent(System.out::println);
}


Неправильно:
// Не используйте Optional в полях класса
private Optional<String> name; //

// Не передавайте Optional как параметр
public void process(Optional<String> data) { //

// Не используйте get() без проверки
String name = optional.get(); //


Практические примеры

// Валидация данных
public boolean isValidUser(User user) {
return Optional.ofNullable(user)
.map(User::getEmail)
.filter(email -> email.contains("@"))
.isPresent();
}

// Работа с коллекциями
public List<String> getActiveUserNames(List<User> users) {
return users.stream()
.map(user -> Optional.ofNullable(user)
.filter(User::isActive)
.map(User::getName)
.orElse("Unknown"))
.collect(Collectors.toList());
}


Частые вопросы на собеседованиях

1. В чем разница между map() и flatMap()?
2. Когда использовать orElse() vs orElseGet()?
3. Почему нельзя использовать Optional в полях класса?
4. Как обработать цепочку вызовов с Optional?
5. Какие есть альтернативы Optional?

Производительность

- orElse() — вычисляется всегда, даже если значение есть
- orElseGet() — вычисляется только при отсутствии значения
- orElseThrow() — современная замена проверкам с исключениями
👍31🔥1🤔1
#Собес #retry #rabbitmq #index

🤔 Middle Java Backend в компанию ТБанк

Техническое собеседование. Лето 2024. Вилка: 250к+. Опыт в резюме: 4 года. Было много технических вопросов, код ревью.

💬 Вопросы:

- Соберёт ли сборщик мусора два объекта с циклической ссылкой при потере внешних ссылок?

- Какой сборщик по умолчанию в Java 11? (G1)

- Какие сборщики мусора знаете? (G1, Serial)

- Как повысить надёжность интеграции с ненадёжным бухгалтерским сервисом?

- Как избежать передеплоя при изменении захардкоженного списка наград? (конфигурация через application.properties vs. внешний сервис).

👉 Все вопросы из этого собеседования (26)

📣 Хочешь больше собесов?
Подпишись на наш главный канал
1
#Собес #git_push #git_pull
🤔 Что делают команды git push и git pull?

💬 Кратко:

Команда git push отправляет ваши локальные изменения в удаленный репозиторий. Команда git pull скачивает изменения из удаленного репозитория и объединяет их с вашей локальной версией.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал
2
#course #ооп #case
📚 Практический анализ ПО с моделированием на UML

Целью курса является обучение слушателей теоретическим основам объектно-ориентированного подхода, практическим методам визуального проектирования и технологии разработки программного обеспечения с использованием компьютеризированных систем разработки (CASE

Перейти к материалу

👉 База вопросов 👉 Новости
🔥1
Многопоточность в Java: synchronized, volatile и Lock 🛡️ (Часть 2)

Привет, коллеги! 👋

Вторая часть про многопоточность. Сегодня разбираем механизмы синхронизации.

synchronized методы

class SafeCounter {
private int count = 0;

public synchronized void increment() {
count++; // Теперь безопасно
}

public synchronized int getCount() {
return count;
}
}


synchronized блоки

class Resource {
private final Object lock = new Object();

public void doWork() {
synchronized(lock) {
// критическая секция
}
}
}


volatile переменные

class TaskProcessor {
private volatile boolean running = true;

public void stop() {
running = false; // Видимость между потоками
}

public void process() {
while (running) {
// работа
}
}
}


ReentrantLock

class LockedCounter {
private final ReentrantLock lock = new ReentrantLock();
private int count = 0;

public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
}


Сравнение подходов

synchronized:
- Простота использования
- Автоматическое управление
- Встроено в язык

ReentrantLock:
- Гибкость (tryLock, fair lock)
- Явное управление
- Требует аккуратности

В третьей части разберем Concurrent коллекции, пулы потоков и современные подходы!

Какие механизмы синхронизации используете вы? 👇

#java #interview #multithreading #synchronized
1🔥1
#Собес #java #collections #multithreading

🤔 Middle+ Java Backend разработчик в компанию Госуслуги

Техническое собеседование. Лето 2024. Вилка: 300-350к. Опыт в резюме: 4+ года. В конце собеседования были задачи на структуры данных, оптимизацию запросов и работу с БД.

💬 Вопросы:

- Как логировать время выполнения методов в бинах Spring унифицированно?

- Как централизованно обрабатывать исключения в REST-контроллерах?

- Как работает @Transactional и что происходит, если метод без аннотации вызывает метод с аннотацией?

- Как спроектировать доступ к балансам пользователей из разных потоков, чтобы операции были консистентны?

- Какие механизмы синхронизации можно использовать, кроме synchronized и Atomic?

👉 Все вопросы из этого собеседования (17)

📣 Хочешь больше собесов?
Подпишись на наш главный канал
1
#Собес #code_coverage #testing #quality_assurance
🤔 Что такое code coverage?

💬 Кратко:

Code coverage (покрытие кода тестами) — это показатель, показывающий, какая часть кода протестирована автоматическими тестами. Выражается в процентах: чем выше показатель, тем меньше риск появления багов.

📌 Полный разбор + примеры использования — на платформе:
👉 Перейти к разбору

📣 Хочешь получать больше таких разборов?
Подпишись на наш главный канал