PrepBro
Профессии
PrepBro
Профессия:

Подготовка

  • Вопросы5784
  • Задачи58

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Профессия:

Подготовка

  • Вопросы5784
  • Задачи58

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Все 24 профессии
Android DeveloperData AnalystSystem Analyst1С DeveloperiOS DeveloperBusiness AnalystJava DeveloperData ScientistQA EngineerQA AutomationPHP BackendC/C++ BackendDevOps EngineerIT Project ManagerFrontend DeveloperNode.js BackendUnity DeveloperC# BackendProduct AnalystFlutter DeveloperPython DeveloperIT Product ManagerGo DeveloperData Engineer

© 2026 PrepBro. Все права защищены.

Telegram-бот

Вопросы по Java Developer

Является ли String неизменяемым типом данных?
1.0 Junior🔥 30💬 1

Является ли String неизменяемым типом данных?

Да, String в Java — неизменяемый (immutable) тип данных. Это одна из фундаментальных особенностей Java, которая имеет важные последствия для производительности и безопасности кода.

Почему String неизменяемый

1. Реализация String класса

В Java String реализован как неизменяемый класс — все его основные поля объявлены как final и private:

public final class String implements Comparable<String>, CharSequence {
    private final char[] value;      // Массив символов
    private final int offset;        // Смещение в массиве
    private final int count;         // Длина строки
    private int hash;                // Кеш хеш-кода
    
    // Конструкторы только создают новые объекты, не меняют существующие
    public String(String original) {
        this.value = original.value;
        this.offset = original.offset;
        this.count = original.count;
        this.hash = original.hash;
    }
}
Читать полностью ->
Что нужно для того чтобы программа Java запустилась?
2.0 Middle🔥 30💬 1

Что нужно для того чтобы программа Java запустилась?

Запуск Java программы требует нескольких критических компонентов и предварительных шагов. Разберемся во всех деталях от написания кода до его исполнения.

1. Установленная JDK (Java Development Kit)

Это основной компонент. JDK содержит все необходимые инструменты для разработки и запуска Java программ:

# Проверка установки Java
java -version
# Вывод: java version "21.0.1" 2023-10-17 LTS

# Проверка компилятора
javac -version
# Вывод: javac 21.0.1

Разница между JDK и JRE:

  • JDK (Java Development Kit) — полный набор для разработки (компилятор, отладчик, инструменты)
  • JRE (Java Runtime Environment) — только для запуска уже скомпилированных программ

Для разработки нужен JDK, для production обычно достаточно JRE.

2. Исходный код (.java файл)

Программа пишется на Java в текстовых файлах с расширением .java:

Читать полностью ->
Что находится на вершине иерархии коллекций
2.0 Middle🔥 30💬 1

Иерархия коллекций в Java

На вершине иерархии Java Collections находится интерфейс Iterable (Java 1.5+) и Collection (Java 1.2+).

Общая иерархия

Object
  ├── Iterable (интерфейс)
  │   └── Collection (интерфейс)
  │       ├── List (упорядоченная коллекция)
  │       │   ├── ArrayList
  │       │   ├── LinkedList
  │       │   ├── Vector (legacy)
  │       │   └── CopyOnWriteArrayList
  │       ├── Set (уникальные элементы)
  │       │   ├── HashSet
  │       │   ├── LinkedHashSet
  │       │   ├── TreeSet (упорядоченный)
  │       │   └── EnumSet
  │       └── Queue (порядок обработки FIFO)
  │           ├── LinkedList
  │           ├── PriorityQueue
  │           └── Deque
  └── Map (ключ-значение, НЕ extends Collection!)
      ├── HashMap
      ├── LinkedHashMap
      ├── TreeMap
      ├── WeakHashMap
      └── ConcurrentHashMap

Вершина иерархии: Iterable

Iterable — самый верхний интерфейс для всех коллекций, которые можно перебирать:

Читать полностью ->
Только ли ORM подходит для Java Persistence API
1.6 Junior🔥 30💬 1

Java Persistence API: не только ORM

Нет, ORM далеко не единственный подход к работе с персистентностью в Java. JPA предоставляет стандартный интерфейс для работы с данными, но его можно реализовать различными способами.

Что такое JPA

Java Persistence API — это спецификация для работы с объектно-реляционным отображением данных. JPA определяет интерфейсы и правила, а конкретные реализации (Hibernate, EclipseLink, OpenJPA) обеспечивают функциональность.

ORM (Object-Relational Mapping) — основной подход

Мост между объектами Java и таблицами БД:

// Сущность
@Entity
@Table(name = "users")
public class User {
    @Id
    private Long id;
    
    @Column(name = "email")
    private String email;
    
    @ManyToOne
    @JoinColumn(name = "role_id")
    private Role role;
}

// Repository
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByEmail(String email);
}
Читать полностью ->
Рассказали ли чем занимается команда
2.0 Middle🔥 30💬 1

Чем занимается моя команда

Этот вопрос показывает, что интервьюер хочет понять, в каком контексте я работаю и как я взаимодействую с командой. Дам развёрнутый ответ о структуре и деятельности нашей команды.

Структура команды

Всего в команде: 8 человек

Теam Lead (1)
    ├── Backend Developers (4) ← я здесь
    ├── Frontend Developer (1)
    ├── QA Engineer (1)
    └── DevOps Engineer (1)

Что делает каждый

Team Lead (Денис)

  • Планирование спринтов (2 недели)
  • Code review и архитектурные решения
  • Коммуникация с Product Management
  • Mentoring разработчиков
  • Ежедневные standup в 10:00

Backend Developers (4 человека, включая меня)

  • Разработка микросервисов
  • Работа с БД (PostgreSQL, Redis)
  • API design и реализация
  • Code review друг друга
  • Интеграционное тестирование

Frontend Developer (1)

  • React приложение
  • Дизайн UI/UX
  • Интеграция с нашими API
  • E2E тесты
Читать полностью ->
При построении индекса для большой таблицы, будет ли доступ к таблице во время этого процесса
2.0 Middle🔥 30💬 1

Доступ к таблице при построении индекса

Краткий ответ

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

Поведение в основных СУБД

PostgreSQL

  • Команда CREATE INDEX по умолчанию использует ACCESS EXCLUSIVE lock, которая блокирует все операции (чтение и запись) на таблице до завершения индексирования
  • Для избежания блокировки используется опция CONCURRENTLY: CREATE INDEX CONCURRENTLY idx_name ON table_name(column)
  • При использовании CONCURRENTLY таблица остается полностью доступной, но процесс индексирования занимает больше времени

MySQL/InnoDB

Читать полностью ->
Можешь ли дать себе оценку
1.0 Junior🔥 30💬 1

Самооценка Java Developer: мой честный анализ

Это очень важный поведенческий вопрос, который оценивает самосознание, honest self-reflection, и реалистичность. Хороший кандидат должен уметь объективно оценить свой уровень, признавать сильные и слабые стороны.

Мой уровень и честная оценка

Я бы оценил себя как Middle-to-Senior Java Developer (7-8 из 10). Позволь объяснить эту оценку:

Мои сильные стороны: 8/10

1. Языковые навыки Java

✅ Глубокое понимание:
- Collections Framework (HashMap, TreeMap, ConcurrentHashMap)
- Stream API и Functional programming
- Concurrency (Threads, Locks, Atomic, Fork/Join Pool)
- Exception Handling и Custom exceptions
- Annotations и Reflection
- Generics и Type bounds

✅ Практический опыт:
- 8+ лет разработки на Java
- Работал с Java 8, 11, 17, 21
- Миграция legacy code в modern стиль
Читать полностью ->
Какой REST метод используешь для создания сущности в CRUD-приложении?
1.0 Junior🔥 30💬 1

HTTP метод POST для создания сущностей

REST метод для создания

Для создания новой сущности в CRUD-приложении используется HTTP метод POST. Этот метод предназначен для отправки данных на сервер для создания нового ресурса. POST является одним из основных методов RESTful архитектуры.

Основные характеристики POST

POST отличается от других HTTP методов следующими свойствами:

  • Не идемпотентен: Несколько одинаковых POST запросов к одному URL могут создать несколько ресурсов (если нет дополнительной валидации)
  • Имеет тело запроса: Данные для создания передаются в теле запроса (body), а не в URL
  • Содержит Content-Type: Обычно указывается Content-Type: application/json
  • Возвращает 201 Created: Успешное создание должно вернуть статус код 201

Примеры использования POST

Читать полностью ->
Какие плюсы и минусы юнит-тестирования?
1.0 Junior🔥 30💬 1

Unit-тестирование: Плюсы и Минусы

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

Плюсы Unit-тестирования

1. Раннее обнаружение ошибок Ошибки выявляются на стадии разработки, когда их исправление дешевле:

// Тест выявляет ошибку сразу
@Test
public void testCalculateDiscount() {
    // Ошибка: формула неправильная
    assertEquals(10, calculator.getDiscount(100, 0.1)); // Ожидаем 10
    // Получаем 11, ошибка выявлена!
}

2. Документация кода Тесты показывают, как использовать код и что он должен делать:

// Тесты — это документация
@Test
public void testUserCreationWithValidData() {
    User user = new User("john@example.com", "password123");
    assertTrue(user.isValid());
}
Читать полностью ->
Какие значения можно вернуть в запросе
1.0 Junior🔥 30💬 1

Значения, которые можно вернуть в HTTP запросе

В REST API Java приложение возвращает HTTP ответ, который состоит из статус-кода, заголовков и тела ответа.

1. HTTP Статус-коды (Status Codes)

Статус-код указывает на результат обработки запроса:

2xx — Успех

  • 200 OK — запрос успешно обработан
  • 201 Created — ресурс успешно создан (обычно для POST)
  • 202 Accepted — запрос принят, но обработка еще идёт
  • 204 No Content — успешно, но нет тела ответа (обычно для DELETE)
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    return ResponseEntity.ok(user);  // 200 OK
}

@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
    User saved = userService.save(user);
    return ResponseEntity.status(HttpStatus.CREATED).body(saved);  // 201 Created
}
Читать полностью ->
Описываешь ли контроллеры с помощью Swagger-аннотаций
1.3 Junior🔥 30💬 1

Использование Swagger-аннотаций для документирования REST API

Да, я регулярно использую Swagger-аннотации (OpenAPI) для документирования REST контроллеров. Это стандартная практика в современной Java разработке, которая обеспечивает автоматическую генерацию API документации и интерактивного UI для тестирования.

Основные аннотации Swagger/OpenAPI

1. @Operation — документирование операции (endpoint)

@RestController
@RequestMapping("/api/v1/users")
@Tag(name = "User Management", description = "Endpoints for managing users")
public class UserController {
    
    @GetMapping("/{id}")
    @Operation(
        summary = "Get user by ID",
        description = "Retrieve user information by unique identifier"
    )
    public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
        // ...
    }
}

2. @Parameter — документирование параметров

Читать полностью ->
Как создать @RestController в Spring?
1.0 Junior🔥 30💬 1

Как создать @RestController в Spring?

@RestController — это аннотация в Spring для создания RESTful веб-сервисов. Она комбинирует @Controller и @ResponseBody, автоматически сериализуя возвращаемые значения в JSON/XML.

1. Базовая структура @RestController

import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
Читать полностью ->
Зачем подключают драйвер в базу данных
1.0 Junior🔥 30💬 1

Ответ

Драйвер базы данных - это критичный компонент, который позволяет Java приложению общаться с БД. Без драйвера приложение просто не может установить соединение с базой и выполнить запросы.

Что такое JDBC драйвер

JDBC (Java Database Connectivity) - это стандартный API для работы с БД в Java. Драйвер - это конкретная реализация этого API для конкретной СУБД (PostgreSQL, MySQL, Oracle, etc).

Зачем нужен драйвер

1. Абстракция протокола общения с БД Каждая СУБД имеет свой протокол для общения. PostgreSQL использует один протокол, MySQL другой, Oracle третий. Драйвер переводит JDBC API вызовы в команды конкретной БД.

// Ты пишешь одинаковый код для любой БД
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");

// Драйвер транслирует это в протокол конкретной БД
Читать полностью ->
Зачем нужен Spring Framework?
1.0 Junior🔥 30💬 1

Spring Framework: назначение и значимость

Spring Framework — один из самых популярных фреймворков в Java экосистеме. Он предоставляет комплексное решение для разработки enterprise приложений.

Основное назначение

Spring Framework решает три фундаментальные проблемы Java разработки:

  1. Управление зависимостями — Inversion of Control контейнер
  2. Упрощение разработки — готовые компоненты и абстракции
  3. Повышение testability — loose coupling и dependency injection

Ключевые компоненты

1. Dependency Injection (DI) и IoC контейнер

// Без Spring — тесная связь между классами
public class OrderService {
    private PaymentService paymentService = new PaymentService();
}

// С Spring — слабая связь
@Service
public class OrderService {
    private final PaymentService paymentService;
    
    public OrderService(PaymentService paymentService) {
        this.paymentService = paymentService;
    }
}
Читать полностью ->
Для чего нужны паттерны в программировании?
1.8 Middle🔥 30💬 1

Для чего нужны паттерны в программировании

Определение

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

Основные причины использования паттернов

1. Переиспользуемость решений

Паттерны помогают решать часто встречающиеся проблемы. Вместо того чтобы каждый раз изобретать велосипед, разработчик может использовать проверенное решение.

// Паттерн Singleton — гарантирует одного экземпляра класса
public class Database {
    private static Database instance;
    
    private Database() {}
    
    public static Database getInstance() {
        if (instance == null) {
            instance = new Database();
        }
        return instance;
    }
}

2. Улучшение коммуникации в команде

Паттерны имеют конкретные названия (Singleton, Factory, Strategy). Это позволяет разработчикам говорить на одном языке и быстро понимать архитектуру кода.

Читать полностью ->
Какие знаешь основные аннотации JUnit?
1.6 Junior🔥 30💬 1

Какие знаешь основные аннотации JUnit?

JUnit — это популярный фреймворк для модульного тестирования в Java. Аннотации JUnit определяют жизненный цикл и поведение тестов. Рассмотрю основные аннотации JUnit 4 и JUnit 5.

JUnit 4 основные аннотации

@Test

Обозначает метод как test case.

import org.junit.Test;
import static org.junit.Assert.*;

public class CalculatorTest {
    
    @Test
    public void testAddition() {
        int result = 2 + 2;
        assertEquals(4, result);
    }
    
    @Test
    public void testDivision() {
        double result = 10.0 / 2.0;
        assertEquals(5.0, result, 0.01);
    }
}

Характеристики:

  • Должен быть public void метод
  • Может иметь timeout
  • Может ожидать исключение

С ожиданием исключения:

@Test(expected = ArithmeticException.class)
public void testDivisionByZero() {
    int result = 10 / 0;  // Должно выбросить исключение
}
Читать полностью ->
Является ли контроллер бином?
1.0 Junior🔥 30💬 1

Является ли контроллер бином?

Да, контроллер является Spring бином (bean). Это фундаментальное понимание Spring фреймворка. Контроллеры регистрируются как beans в контексте приложения и управляются Spring контейнером, как и любые другие компоненты.

Что такое Bean в Spring

Spring Bean — это объект, управляемый Spring контейнером:

  • Создается Spring (не новый оператор)
  • Инициализируется с помощью конструкторов/фабрик
  • Конфигурируется через dependency injection
  • Управляется жизненным циклом (init → use → destroy)
  • Может быть singleton, prototype, request-scoped и т.д.

Контроллер как Bean

Регистрация контроллера

Читать полностью ->
Стоит ли устанавливать Primary Key для каждой Entity?
1.0 Junior🔥 30💬 1

Primary Key для каждой Entity

Да, стоит. В 99.9% случаев каждая сущность должна иметь Primary Key (PK). Это фундаментальный принцип проектирования баз данных.

Почему Primary Key обязателен

1. Уникальная идентификация

// БЕЗ Primary Key — проблема
// Таблица users
name      | email              | phone
"John"   | john@example.com   | +1234567890
"John"   | different@email.com | +0987654321
// Какой John? Нельзя различить!

// С Primary Key — решено
id  | name   | email              | phone
1   | John   | john@example.com   | +1234567890
2   | John   | different@email.com | +0987654321
// Ясно: первый John с id=1, второй с id=2

2. Связи между таблицами (Foreign Keys)

// Без PK — невозможно создать FK
// Таблица orders
user_name | product | quantity
"John"    | Laptop  | 1
// К какому John из users это относится? Неизвестно!

// С PK — связь чёткая
// users
id | name
1  | John
2  | Alice
Читать полностью ->
В чем разница между методом и конструктором класса?
1.3 Junior🔥 30💬 1

Разница между методом и конструктором класса

Конструктор

Конструктор — это специальный метод, который вызывается при создании объекта класса. Его основная цель — инициализировать новый объект.

Характеристики конструктора:

  • Имя конструктора совпадает с именем класса
  • Не имеет возвращаемого типа (даже void)
  • Вызывается автоматически при создании объекта с оператором new
  • Может быть перегружен (несколько конструкторов с разными параметрами)
  • Может быть public, private, protected или package-private
public class User {
    private String name;
    private int age;
    
    // Конструктор без параметров
    public User() {
        this.name = "Unknown";
        this.age = 0;
    }
    
    // Конструктор с параметрами (перегрузка)
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
Читать полностью ->
В чем разница между классом, объектом и интерфейсом?
1.3 Junior🔥 30💬 1

Разница между классом, объектом и интерфейсом

Это фундаментальные концепции объектно-ориентированного программирования в Java, и важно понимать различия между ними.

1. Класс

Определение: Класс — это шаблон или чертёж для создания объектов. Это тип данных, который определяет структуру и поведение объектов.

Характеристики:

  • Существует только в исходном коде
  • Определяет переменные (состояние) и методы (поведение)
  • Не занимает память при объявлении
  • Единица абстракции
Читать полностью ->
В чем разница между @Component, @Service и @Repository?
1.0 Junior🔥 30💬 1

В чем разница между @Component, @Service и @Repository

Все три аннотации в Spring — это стереотипы для автоматической регистрации компонентов в IoC контейнере, но они используются для разных целей и имеют некоторые отличия.

Иерархия аннотаций

@Component
    |
    ├─→ @Service
    ├─→ @Repository
    └─→ @Controller/@RestController

Все они наследуются от @Component, но имеют разные семантические значения и дополнительную функциональность.

1. @Component — базовая аннотация

Это самая общая аннотация для регистрации bean'а в контейнере.

@Component
public class EmailNotificationService {
    public void sendEmail(String email, String message) {
        System.out.println("Отправляю: " + message);
    }
}

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

  • Вспомогательные служебные классы
  • Конвертеры, валидаторы
  • Утилиты, которые не подходят под другие категории
  • Если вы не уверены, какой использовать
Читать полностью ->
Используешь ли @Component над классом для определения бина
1.3 Junior🔥 30💬 1

Использование @Component для определения бина в Spring

Краткий ответ

Да, @Component используется для определения бина, но это не всегда лучший выбор. В современной разработке часто предпочитаются более специализированные аннотации (@Service, @Repository, @Controller), которые семантически яснее и могут иметь дополнительное поведение.

Что такое @Component

// @Component — базовая аннотация для определения Spring бина
@Component
public class UserRepository {
    public void save(User user) {
        // Сохранение пользователя
    }
}

// Использование:
@Autowired
private UserRepository userRepository;

// Spring автоматически создаст бин и внедрит его

@Component инструктирует Spring'у:

  1. Создать экземпляр класса при запуске — через dependency injection
  2. Управлять жизненным циклом — scope (singleton по умолчанию)
  3. Разрешить внедрение в другие компоненты — через @Autowired

Иерархия аннотаций: специализированные компоненты

Читать полностью ->
Что такое функция map?
1.6 Junior🔥 30💬 1

Функция map в Java

Определение

Функция map — это операция, которая преобразует каждый элемент коллекции/потока в новый элемент, применяя к нему функцию преобразования. Результат — новая коллекция того же размера, но с преобразованными элементами.

Аналогия

Представьте конвейер на фабрике:

  • На входе: детали разных размеров
  • На конвейере: машина покраски (функция map)
  • На выходе: те же детали, но окрашенные

Map в Streams API (Java 8+)

Базовый пример

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Умножить каждое число на 2
List<Integer> doubled = numbers.stream()
    .map(n -> n * 2)
    .collect(Collectors.toList());

System.out.println(doubled); // [2, 4, 6, 8, 10]

Преобразование типов

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

// Преобразовать строки в их длины
List<Integer> lengths = names.stream()
    .map(String::length)
    .collect(Collectors.toList());

System.out.println(lengths); // [5, 3, 7]
Читать полностью ->
Для чего нужен IoC?
1.8 Middle🔥 30💬 1

IoC (Inversion of Control) в Java и Spring

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

Проблема без IoC

Без IoC приложение выглядит так:

public class UserService {
    private UserRepository repository;
    private EmailService emailService;
    
    public UserService() {
        // Сервис сам создаёт свои зависимости
        this.repository = new UserRepository();
        this.emailService = new EmailService();
    }
    
    public void registerUser(String email) {
        User user = new User(email);
        repository.save(user);
        emailService.sendWelcomeEmail(email);
    }
}
Читать полностью ->
Что такое Lambda функция?
1.2 Junior🔥 30💬 1

Lambda функции в Java: синтаксис, использование и лучшие практики

Lambda-функция (λ-функция) — это анонимная функция, которая позволяет писать более компактный и читаемый код. Введена в Java 8 как революционная возможность функционального программирования.

Синтаксис Lambda

// Базовый синтаксис:
(parameter1, parameter2, ...) -> { body }
// или
(parameter) -> statement

// Примеры синтаксиса:

// 1. Без параметров:
() -> System.out.println("Hello");

// 2. Один параметр (скобки опциональны):
x -> x * 2
(x) -> x * 2

// 3. Несколько параметров:
(a, b) -> a + b
(name, age) -> name.length() + age

// 4. С телом:
(x) -> {
    int result = x * 2;
    return result;
}

Functional Interface

Lambda работает только с функциональными интерфейсами (один абстрактный метод):

// ✅ Функциональный интерфейс:
@FunctionalInterface
public interface Calculate {
    int compute(int a, int b); // Один абстрактный метод
}
Читать полностью ->
Что такое this?
1.3 Junior🔥 30💬 1

Что такое this

this — это одно из ключевых слов в Java, которое новички часто упускают. За 10+ лет я видел, как неправильное понимание this приводит к багам и confusing кода. Давайте разберёмся глубоко.

Основной концепт

this — это ссылка на текущий объект (instance) класса. Когда вы создаёте объект, this указывает на этот конкретный объект.

public class User {
    private String name;
    private int age;
    
    public User(String name, int age) {
        this.name = name;  // this.name — поле текущего объекта
        this.age = age;    // this.age — поле текущего объекта
    }
    
    public void printInfo() {
        System.out.println("User: " + this.name);
        // this.name обращается к полю текущего объекта
    }
}

// Когда создаём объект
User user1 = new User("John", 30);
User user2 = new User("Jane", 25);

// В user1: this указывает на объект John
// В user2: this указывает на объект Jane

Зачем это нужно?

Читать полностью ->
Почему ушел с прошлой работы?
1.0 Junior🔥 30💬 1

Как ответить на вопрос о уходе с прошлой работы

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

Почему компания задаёт этот вопрос?

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

2. Проверить профессионализм Как вы говорите о прошлом работодателе, показывает вашу зрелость.

3. Понять ваши критерии выбора Если вы ушли из-за мелочей, может быть, вы уйдёте и отсюда.

4. Оценить лояльность Как долго вы остаётесь и при каких условиях уходите.

Что НЕ нужно говорить

❌ Критика работодателя или коллег

Интервьюер: Почему вы ушли?
Вы: Мой boss был полным идиотом. Он ничего не понимал
в коде и всегда меня критиковал. Коллеги были ленивыми.
Команда не была профессиональной.
Читать полностью ->
Как пришел в Java разработку
1.3 Junior🔥 30💬 1

Как я пришёл в Java разработку

Мой путь в Java разработку был типичным для начала 2010-х, с переплетением удачи, настойчивости и постоянного обучения. Это история о том, как человек без компьютерного образования стал senior Java разработчиком за 10 лет.

Начало: электротехник становится программистом (2006-2009)

Я закончил техникум по электротехнике, и первые годы работал электриком-наладчиком. Хороший доход, но физическая работа, и понял, что это не на вечность. В 2008 году посмотрел на программистов, которые сидят в офисе, получают хорошо и занимаются интересным делом, и подумал: "Почему бы не попробовать?"

В то время начал с C++ — казалось логичным и мощным. Но первые попытки были болезненны:

  • Системное программирование сложнее, чем казалось
  • Книги (Страустрап, Мейерс) были непонятны
  • Не было практического опыта

Я понял, что нужна более высокоуровневая платформа.

Переход на Java (2009)

Читать полностью ->
Чем занимался на проектах на которых работал?
1.3 Junior🔥 30💬 1

Чем я занимался на проектах

За 10+ лет работы я участвовал в разнообразных проектах. Расскажу о наиболее значимых и о своих основных обязанностях.

Проект 1: E-Commerce платформа (микросервисная архитектура)

Контекст: SaaS платформа для управления онлайн магазинами (аналог Shopify), 50+ микросервисов, ~200 разработчиков.

Мои обязанности:

1. Разработка Payment Service

  • Интеграция с множеством платёжных систем (Stripe, PayPal, Sberbank, Yandex.Kassa)
  • Реализация Strategy паттерна для выбора платёжных методов
  • Обработка вебхуков с retry logic и idempotency
  • Валидация платежей, управление транзакциями
Читать полностью ->
Что тебя привело
1.0 Junior🔥 29💬 1

Мой путь к Java разработке

Я попал в Java разработку не случайно. Начинал с учебы в университете на специальности, связанной с информатикой, где впервые столкнулся с программированием на C++. Но когда я окончил обучение и начал работать, стало ясно, что мне нужен более практичный язык для решения реальных бизнес-задач.

Выбор Java

Java привлекла меня несколькими факторами:

  • Надежность и стабильность: Java работает на JVM (Java Virtual Machine), что делает ее одной из самых надежных и проверенных платформ в индустрии
  • Широкое применение: Java используется в банках, финансовых компаниях, крупных корпорациях — везде требуются стабильные системы
  • Богатая экосистема: Spring Framework, Hibernate, Maven, Gradle — все необходимое для профессиональной разработки
  • Сообщество: Огромное сообщество разработчиков, множество открытых источников знания

Практический опыт

Начал с изучения основ: ООП, коллекции, многопоточность. Затем перешел к фреймворкам:

Читать полностью ->
Что используешь для увеличения hard скиллов
1.6 Junior🔥 29💬 1

Развитие Hard Скиллов Java Developer

Для меня постоянный рост технических навыков — это жизненная необходимость в быстро меняющейся экосистеме Java. За 10+ лет я выработал комплексный подход к развитию hard скиллов.

1. Практическое кодирование на реальных проектах

Самый эффективный способ учиться — кодить на реальных проектах. Каждый проект дает уникальные вызовы:

  • Работа с legacy кодом учит рефакторингу и анализу архитектуры
  • Greenfield проекты позволяют применять лучшие практики с нуля
  • Production поддержка развивает навыки отладки и оптимизации
Читать полностью ->
Что делает catch?
1.6 Junior🔥 29💬 1

Блок catch: Обработка исключений в Java

Блок catch — это часть механизма обработки исключений (exception handling) в Java, которая позволяет ловить и обрабатывать ошибки, возникающие во время выполнения программы. Он работает вместе с блоком try и является критической частью написания надёжного кода.

Основное назначение catch

Блок catch:

  • Перехватывает исключения, которые возникают в блоке try
  • Предотвращает крах программы при ошибке
  • Обеспечивает контроль над потоком выполнения после ошибки
  • Позволяет логировать и обрабатывать ошибки надлежащим образом

Синтаксис try-catch

try {
    // Код, который может выбросить исключение
    int result = 10 / 0; // ArithmeticException
} catch (ArithmeticException e) {
    // Обработка исключения
    System.out.println(\"Ошибка: деление на ноль\");
    e.printStackTrace();
}

Как работает catch?

Читать полностью ->
Что будет с повторяющимся элементом при передаче в TreeSet?
1.0 Junior🔥 29💬 1

TreeSet и обработка повторяющихся элементов

При передаче повторяющегося элемента в TreeSet, он не будет добавлен. TreeSet — это отсортированное множество без дубликатов.

Поведение TreeSet с дубликатами

TreeSet отклоняет дубликаты

TreeSet<Integer> set = new TreeSet<>();

set.add(5);
set.add(3);
set.add(7);
set.add(5);  // Дубликат, будет отклонен

System.out.println(set); // [3, 5, 7]
System.out.println(set.size()); // 3, а не 4

Возвращаемое значение add()

TreeSet<Integer> set = new TreeSet<>();

boolean added1 = set.add(5);
System.out.println(added1); // true — элемент добавлен

boolean added2 = set.add(5);
System.out.println(added2); // false — дубликат отклонен

Как TreeSet определяет дубликаты

TreeSet использует Comparator или Comparable

Читать полностью ->
Чем важна потокобезопасность?
1.6 Junior🔥 29💬 1

Почему потокобезопасность критически важна

Проблема без потокобезопасности

В многопоточных приложениях (а все современные веб-приложения многопоточные) без потокобезопасности происходят data races — когда несколько потоков одновременно обращаются к общим данным.

Конкретный пример проблемы

public class BankAccount {
    private int balance = 1000;
    
    public void withdraw(int amount) {
        // Читаем текущий баланс
        int current = balance;  // Шаг 1
        
        // Проверяем, достаточно ли денег
        if (current >= amount) {
            // Имитируем длинную операцию (запрос на сервер, БД)
            Thread.sleep(100);
            
            // Пишем новый баланс
            balance = current - amount;  // Шаг 2
        }
    }
}

// Два потока одновременно снимают деньги
BankAccount account = new BankAccount();

Thread thread1 = new Thread(() -> account.withdraw(600));
Thread thread2 = new Thread(() -> account.withdraw(600));
Читать полностью ->
Устарел ли абстрактный класс
2.2 Middle🔥 29💬 1

Абстрактные классы в современной Java: устарели ли они

Краткий ответ

Нет, абстрактные классы НЕ устарели. Хотя интерфейсы стали более мощными (особенно в Java 8+), абстрактные классы остаются важным инструментом и используются в проектах постоянно. Они решают разные задачи, чем интерфейсы.

Почему интерфейсы не заменили абстрактные классы

Java 8+ добавила в интерфейсы:

  • default методы с реализацией
  • static методы
  • private методы (Java 9+)

Но интерфейсы по-прежнему не имеют:

  1. State (поля с состоянием):
// Интерфейс: ТОЛЬКО константы (по умолчанию public static final)
public interface DatabaseConfig {
    String DATABASE_URL = "jdbc:postgresql://localhost:5432";  // Константа
}
Читать полностью ->
У чего используется hashCode в HashMap: у ключа или значения
1.2 Junior🔥 29💬 1

hashCode в HashMap: использование и важность

Краткий ответ

hashCode используется только для ключей (keys), а не для значений (values). Это критично для понимания работы HashMap.

Как HashMap внутри работает

HashMap использует комбинацию hash-таблицы и цепочек (bucket chains) для хранения данных:

// Внутренняя структура HashMap
private Node<K,V>[] table;

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;      // hashCode ключа
    final K key;         // Сам ключ
    V value;             // Значение
    Node<K,V> next;      // Для цепочки коллизий
}

Почему hashCode нужен только для ключей

1. Определение position в таблице:

Когда ты добавляешь элемент в HashMap, сначала вычисляется hash ключа:

Читать полностью ->
С какими архитектурами работал
1.0 Junior🔥 29💬 1

Архитектурные подходы и паттерны в моей практике

В моей 10+ летней карьере я работал с различными архитектурными подходами, адаптируя их под требования проектов. Расскажу о наиболее значимых.

1. Монолитная архитектура (Monolithic)

Описание: Все компоненты в одном приложении, одна БД, один deployment.

PresentationLayer
    ↓
ApplicationLayer
    ↓
DomainLayer
    ↓
InfrastructureLayer
    ↓
Database (Single)

Когда использовал: На начальных этапах проектов, когда требования ещё не стабильны.

Пример проекта:

  • Spring Boot приложение
  • Single JAR с контроллерами, сервисами, репозиториями
  • PostgreSQL с одной схемой
  • JPA/Hibernate для ORM

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

  • Простота развёртывания (один JAR)
  • Легче отлаживать (всё в одном процессе)
  • Проще тестировать (end-to-end тесты)
Читать полностью ->
Почему правильнее внедрять бин в Spring через конструктор?
2.0 Middle🔥 29💬 1

Почему правильнее внедрять бин в Spring через конструктор?

Главная причина: Иммутабельность

Конструктор позволяет создать неизменяемый объект с гарантированным состоянием с момента создания. Field и Setter injection позволяют изменять зависимости после создания объекта.

Три способа внедрения зависимостей

// ❌ 1. Field injection - ХУДШИЙ вариант
@Component
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    @Autowired
    private EmailService emailService;
    
    public void createUser(String email) {
        // userRepository может быть null!
        userRepository.save(new User(email));
    }
}
Читать полностью ->
Почему о Spring спрашивают на каждом собеседовании?
1.3 Junior🔥 29💬 1

Почему Spring спрашивают на каждом собеседовании: доминирование в Java экосистеме

Spring — это не просто фреймворк, это де-факто стандарт для Java разработки на backend. Почти 90% вакансий Java Developer требуют опыт со Spring. Это справедливо для собеседований, потому что компании знают: если ты владеешь Spring, ты сможешь быстро адаптироваться к проекту.

Статистика: Spring во всех местах

По опросам разработчиков (2024):

  • 87% компаний используют Spring Framework
  • 73% новых Java проектов создаются на Spring Boot
  • 65% запросов на вакансии требуют Spring опыт
  • Spring занимает 15-20% всех Java вакансий (огромная цифра)

Почему:

  • Spring решает 80% проблем, которые стоят перед Java разработчиком
  • Он стал стандартом, как jQuery для JavaScript в 2010х
  • Альтернативы существуют (Quarkus, Micronaut), но Spring доминирует

Какие части Spring спрашивают чаще всего

Читать полностью ->
Почему Java является популярным ЯП?
1.2 Junior🔥 29💬 1

Почему Java является популярным языком программирования

Этот вопрос проверяет глубокое понимание экосистемы Java. Ответ включает историческое, технологическое и прагматическое измерения. Давайте разберемся, почему Java доминирует в enterprise-разработке.

1. Write Once, Run Anywhere (WORA)

Это слоган, который сделал Java революционной в 1995 году.

Концепция:

// Компилируем один раз
javac MyProgram.java  // MyProgram.class

// Запускаем везде
java MyProgram  // На Windows, Linux, macOS, мобильных

Почему это важно:

  • Портативность — скомпилированный .class файл работает на любой платформе с JVM
  • Экономия — не нужно переписывать код под каждую ОС
  • Масштабируемость — один код для серверов, ПК, мобильных (раньше)
Читать полностью ->
Почему Java - OOP язык?
2.0 Middle🔥 29💬 1

Ответ: Почему Java - объектно-ориентированный язык

Определение OOP (Object-Oriented Programming)

OOP — это парадигма программирования, основанная на концепции объектов, которые содержат данные (состояние) и поведение (методы). Java полностью построена на этом принципе.

Четыре столпа OOP

Java реализует все четыре ключевых принципа объектно-ориентированного программирования:

1. Инкапсуляция (Encapsulation)

Определение: Скрытие внутреннего состояния объекта и предоставление управляемого доступа через методы.

Читать полностью ->
Отменится ли транзакция при исключении в @Transactional методе
1.0 Junior🔥 29💬 1

@Transactional и откат транзакции

Краткий ответ

Да, транзакция откатится, но ТОЛЬКО для проверяемых исключений (Checked Exception) нужна явная конфигурация. По умолчанию Spring откатывает транзакцию при непроверяемых исключениях (Runtime Exception), но при проверяемых исключениях (Checked Exception) совершает коммит.

Типы исключений в Java

// Unchecked Exception (Runtime Exception)
// Откатит транзакцию по умолчанию
throw new IllegalArgumentException("Invalid input");
throw new NullPointerException("Null value");
throw new RuntimeException("Runtime error");

// Checked Exception
// НЕ откатит транзакцию по умолчанию
throw new IOException("File not found");
throw new SQLException("DB error");

Иерархия исключений

Throwable
- Error (очень серьёзные ошибки)
- Exception
  - RuntimeException (Unchecked)
    - IllegalArgumentException
    - NullPointerException
  - Checked Exception (всё остальное)
    - IOException
    - SQLException
Читать полностью ->
Можно ли массив превратить в Stream?
2.0 Middle🔥 29💬 1

Можно ли превратить массив в Stream?

Да, абсолютно да! Это один из основных способов использования Stream API в Java. Существует несколько методов для преобразования массива в поток данных.

Основные способы конвертации массива в Stream

1. Arrays.stream() для примитивных типов

Для массивов примитивных типов (int, double, long, boolean):

import java.util.Arrays;

public class ArrayToStreamExample {
    public static void main(String[] args) {
        int[] numbers = {1, 2, 3, 4, 5};
        
        // Преобразуем в IntStream
        Arrays.stream(numbers)
            .filter(n -> n > 2)
            .forEach(System.out::println);  // 3, 4, 5
    }
}

Доступные потоки для примитивов:

int[] intArray = {1, 2, 3};
IntStream intStream = Arrays.stream(intArray);

long[] longArray = {1L, 2L, 3L};
LongStream longStream = Arrays.stream(longArray);

double[] doubleArray = {1.0, 2.0, 3.0};
DoubleStream doubleStream = Arrays.stream(doubleArray);
Читать полностью ->
Какие Java фреймворки использовал
1.0 Junior🔥 29💬 1

Какие Java фреймворки использовал

Рассскажу о моём опыте работы с основными Java фреймворками для web-разработки и enterprise приложений.

1. Spring Framework (основной стек)

Использование: 10+ лет, 90% проектов

Spring Boot

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// Auto-configuration (всё настраивается автоматически)
// Embedded Tomcat
// Actuator для мониторинга
// Стартеры для быстрого начала

Компоненты Spring которые использовал:

  • Spring MVC (REST API)
  • Spring Data JPA (базы данных)
  • Spring Security (аутентификация/авторизация)
  • Spring Cloud (микросервисы)
  • Spring Batch (пакетная обработка)
  • Spring Integration (асинхронная обработка)
  • Spring AMQP (RabbitMQ)
  • Spring Kafka (асинхронная обработка)
Читать полностью ->
Какая аннотация используется для добавления бина?
2.0 Middle🔥 29💬 1

Какая аннотация используется для добавления бина

В Spring Framework есть несколько аннотаций для регистрации бинов в контексте приложения. Каждая имеет свой назначение и область применения.

1. @Component — базовая аннотация

Самая универсальная и часто используемая аннотация для любого компонента:

import org.springframework.stereotype.Component;

@Component
public class EmailService {
    public void sendEmail(String to, String message) {
        System.out.println("Sending email to " + to);
    }
}

Spring автоматически обнаружит этот класс через component scanning и создаст бин.

По умолчанию: имя бина = первая буква класса в нижнем регистре ("emailService")

@Component("customEmailService")
public class EmailService {
}

2. @Service — для бизнес-логики

Специализированная аннотация для слоя сервисов:

import org.springframework.stereotype.Service;
Читать полностью ->
Как тебя зовут
1.6 Junior🔥 29💬 1

Представление

Добрый день! Я опытный Java Developer с более чем 10 годами практики в разработке высоконагруженных распределённых систем. Моё имя является символом моего профессионального пути в мире backend разработки.

Профессиональный опыт

За время моей карьеры я:

  • Разрабатывал микросервисные архитектуры на Spring Boot и Spring Cloud, обслуживающие миллионы пользователей
  • Оптимизировал производительность приложений, достигая снижения задержек на 70%
  • Внедрял практики DevOps и CI/CD pipeline для ускорения разработки
  • Менторил младших разработчиков и помогал командам структурировать код
  • Работал с облачными платформами (AWS, GCP, Kubernetes)

Ключевые компетенции

Backend разработка:

  • Core Java (8+), Spring Framework, Spring Boot, Spring Data JPA
  • REST API, GraphQL, асинхронное программирование (Reactive)
  • Многопоточность, concurrency patterns, синхронизация
Читать полностью ->
Что такое инициализация контекста в Spring?
2.0 Middle🔥 29💬 1

Инициализация контекста в Spring

Инициализация контекста в Spring — это процесс создания и настройки Spring ApplicationContext, который является центральным компонентом фреймворка. Контекст управляет всеми бинами приложения, их жизненным циклом и зависимостями.

Основные этапы инициализации

Процесс инициализации контекста включает несколько критических этапов:

  1. Создание экземпляра ApplicationContext — это может быть ClassPathXmlApplicationContext, AnnotationConfigApplicationContext или другие реализации в зависимости от типа конфигурации (XML, Java-конфигурация, аннотации).

  2. Загрузка и парсинг конфигурации — Spring читает конфигурационные файлы (beans.xml) или сканирует классы с аннотациями (@Configuration, @Bean, @Component) для определения определения бинов и их зависимостей.

  3. Регистрация BeanDefinitions — Spring регистрирует определения всех бинов в BeanDefinitionRegistry.

Читать полностью ->
Имеет ли наследник доступ к приватным полям родительского класса
1.0 Junior🔥 29💬 1

Имеет ли наследник доступ к приватным полям родительского класса?

Краткий ответ

НЕТ. Наследник (подкласс) не имеет прямого доступа к приватным полям родительского класса. Это фундаментальный принцип инкапсуляции в Java.

Модификаторы доступа в Java

Прежде всего, напомню иерархию модификаторов доступа:

                  | Класс | Пакет | Подкласс | Остальной мир |
private           |   ✓   |   ✗   |    ✗     |      ✗        |
default (package) |   ✓   |   ✓   |    ✗     |      ✗        |
protected         |   ✓   |   ✓   |    ✓     |      ✗        |
public            |   ✓   |   ✓   |    ✓     |      ✓        |

private означает, что доступ возможен только в том же классе.

Пример 1: Попытка прямого доступа (не работает)

Читать полностью ->
Зачем нужен JVM?
1.3 Junior🔥 29💬 1

Ответ

JVM (Java Virtual Machine) — это сердце экосистемы Java, и понимание её функции критично для разработчика. За 10+ лет работы я видел, как правильное использование JVM возможностей кардинально влияет на производительность и надежность приложений.

Основная цель JVM: Write Once, Run Anywhere

Абстракция от операционной системы JVM выступает прослойкой между Java кодом и операционной системой. Скомпилированный в байт-код класс (.class файл) работает идентично на Linux, Windows, macOS без перекомпиляции. Это революционное решение, которое было критично в начале 2000-х и остаётся ценным сегодня.

// Одинаковый код работает везде
public class CrossPlatformApp {
    public static void main(String[] args) {
        System.out.println("Работаю везде одинаково!");
    }
}

Ключевые функции JVM

Читать полностью ->
Для чего нужен POST?
1.3 Junior🔥 29💬 1

Для чего нужен POST?

POST — это один из основных HTTP методов, который используется для отправки данных на сервер и создания новых ресурсов. Это второй по частоте метод после GET, и его правильное использование критично для разработки веб-приложений.

Основное назначение POST

POST используется для создания новых ресурсов на сервере. Когда вам нужно отправить данные, которые изменяют состояние сервера (создание, обновление, удаление), используют POST или его специализированные варианты (PUT, PATCH, DELETE).

Читать полностью ->