Java | Вопросы собесов
11.4K subscribers
38 photos
3 videos
1.53K links
Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое шаблон Event Sourcing?

Event Sourcing — это подход, при котором вся история изменений состояния хранится как последовательность событий.
Плюсы:
- можно восстановить любое состояние;
- идеален для аудита и CQRS.
Минусы:
- сложно мигрировать;
- высокая сложность чтения без проекций.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥2
🤔 Какая структура данных в коллекции List?

В Java интерфейс List представляет упорядоченную коллекцию элементов, допускающую дубликаты. В зависимости от конкретной реализации (ArrayList, LinkedList, Vector), используется разная структура данных.

🚩Основные реализации `List` и их структуры данных

🟠ArrayList
Динамический массив
Структура данных: массив
Быстрая индексация O(1), но медленное удаление/вставка в середину O(n).
List<String> list = new ArrayList<>();


🟠LinkedList
Двусвязный список
Структура данных: двусвязный список
Быстрое добавление/удаление элементов O(1), но медленный доступ по индексу O(n).
List<String> list = new LinkedList<>();


🟠Vector
Динамический массив (синхронизирован)
Структура данных: массив (как ArrayList), но с синхронизацией.
Устарел, используется редко из-за synchronized методов (медленнее ArrayList).
List<String> list = new Vector<>();


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Какие есть виды объединения веток?

- Merge — объединяет изменения, создаёт новый коммит слияния;
- Rebase — переносит коммиты на другую ветку, изменяя их историю;
- Squash — объединяет несколько коммитов в один перед слиянием;
- Fast-forward — слияние без нового коммита, если нет расхождений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍2🔥1
🤔 Какая сложность поиска метода по ключу в коллекции TreMap?

В TreeMap поиск элемента по ключу выполняется за O(log n).

🚩Почему сложность `O(log n)`?

TreeMap основан на красно-чёрном дереве (Red-Black Tree).
Красно-чёрное дерево – это самобалансирующееся бинарное дерево.
В худшем случае, глубина дерева ≈ log₂(n), поэтому:
Поиск (get(key)) выполняется за O(log n).
Вставка (put(key, value)) тоже O(log n), так как требует балансировки.
import java.util.TreeMap;

public class TreeMapExample {
public static void main(String[] args) {
TreeMap<Integer, String> treeMap = new TreeMap<>();
treeMap.put(10, "Ten");
treeMap.put(20, "Twenty");
treeMap.put(30, "Thirty");

System.out.println(treeMap.get(20)); // Поиск за O(log n)
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Что такое ordering?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔3👍2🔥1
🤔 Слышал ли что то про метод intern?

Метод intern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.

🚩Как работает `intern()`?

Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");

System.out.println(s1 == s2); // false (разные объекты)


С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();

System.out.println(s1 == s2); // true (одна строка в String Pool)


🚩Что такое `String Pool`?

Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект

System.out.println(s1 == s2); // true


🚩Когда использовать `intern()`?

Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}


Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 В чём отличие List от Set?

- List — сохраняет порядок элементов, допускает повторы;
- Set — не допускает дубликатов, порядок может быть произвольным (кроме LinkedHashSet, TreeSet).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4🤔1
🤔 Чем отличается компонент от бина?

В Spring оба термина – Bean и Component – связаны с управляемыми объектами, но у них разное предназначение.

🚩Что такое `@Component`?

@Component делает класс Spring-бином автоматически.
Spring сам создаст и зарегистрирует объект в контейнере.
import org.springframework.stereotype.Component;

@Component
public class Car {
public void drive() {
System.out.println("Машина едет...");
}
}


Как получить объект?
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);
car.drive();
}
}


🚩Что такое `@Bean`?

@Bean создаёт Bean вручную в @Configuration-классе.
Можно использовать, если нужно передать параметры или создать Bean из библиотеки.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
@Bean
public Car car() {
return new Car(); // Создаём объект вручную
}
}


Как получить Bean?
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
Car car = context.getBean(Car.class);


Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Чем отличаются подходы Trunk Based и Feature Branch?

- Trunk-Based: разработчики часто коммитят напрямую в основную ветку, минимизируя долгоживущие ветви.
- Feature Branch: каждая новая функциональность разрабатывается в отдельной ветке и затем вливается в основную.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥3
🤔 В чем разница Spring Boot и Spring?

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

🚩Spring Framework

Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.

🚩Spring Boot

С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.

🚩Различия

🟠Цель
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.

🟠Конфигурация
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.

🟠Встроенный сервер
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.

Ставь 👍 и забирай 📚 Базу знаний
👍3🔥1
🤔 Как разрешаются проблемы дефицита памяти и исключения OutOfMemoryError?

OutOfMemoryError возникает, когда JVM не может выделить память. Причины и решения:
- Утечка памяти — объекты остаются в памяти без необходимости → использовать профилировщики.
- Неправильные настройки Heap → увеличить размер -Xmx, -Xms.
- Плохая логика (бесконечные коллекции, рекурсия) → анализ и оптимизация кода.
- Неосвобождённые ресурсы → использовать try-with-resources.
Важно отлаживать утечки и оптимизировать структуру данных.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Какие шаги нужно выполнить для прочтения текстового файла?

Для прочтения текстового файла в Java нужно выполнить несколько шагов.

1⃣Выбор метода чтения файла
В Java есть несколько способов читать текстовые файлы:
1. Использование класса FileReader.
2. Использование BufferedReader для построчного чтения.
3. Использование java.nio.file.Files для чтения всех строк файла.
4. Применение Scanner для гибкого чтения данных.

2⃣Открытие файла
Нужно указать путь к файлу (абсолютный или относительный) и передать его в выбранный класс. Например:
FileReader reader = new FileReader("file.txt");


3⃣Чтение данных
Выберите подходящий метод для обработки содержимого файла:
- Построчное чтение.
- Чтение символов.
- Чтение всех строк сразу (например, через Files.readAllLines).

4⃣Закрытие ресурса
Для освобождения системных ресурсов после работы с файлом нужно закрыть поток. Это делается вручную или с помощью конструкции try-with-resources.

🚩Примеры реализации

Построчное чтение с BufferedReader
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileReadExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // Вывод строки
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение файла с помощью Files
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class FileReadExample {
public static void main(String[] args) {
try {
List<String> lines = Files.readAllLines(Paths.get("file.txt"));
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
}
}
}


Чтение через Scanner
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class FileReadExample {
public static void main(String[] args) {
try (Scanner scanner = new Scanner(new File("file.txt"))) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine()); // Построчное чтение
}
} catch (FileNotFoundException e) {
System.out.println("Файл не найден: " + e.getMessage());
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍6
🤔 Какие методы располагаются в интерфейсе?

В интерфейсе могут быть абстрактные методы, которые по умолчанию являются public и abstract. Java 8 добавила методы с реализацией по умолчанию (default) и статические методы (static). Также можно использовать приватные методы (private) для внутренних нужд интерфейса. Это делает интерфейсы более функциональными и гибкими для расширения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8
🤔 К какой категории сущности относится Primary Key?

Primary Key (первичный ключ) в базах данных относится к категории ограничений (constraints). Это специальное ограничение, которое накладывается на столбец или группу столбцов таблицы, чтобы однозначно идентифицировать каждую строку (запись) в таблице.

🚩Основные свойства Primary Key

🟠Уникальность
Значение первичного ключа должно быть уникальным для каждой строки. Это исключает дублирование записей.
🟠Не может быть NULL
Столбец (или столбцы), определённый как Primary Key, не допускает значения NULL, так как NULL не может однозначно идентифицировать строку.
🟠Только один Primary Key на таблицу
Таблица может иметь только один первичный ключ, но он может состоять из одного столбца (простой ключ) или нескольких (составной ключ).

🚩Зачем нужен Primary Key?

Для однозначной идентификации записей в таблице.
Для создания связей между таблицами в реляционных базах данных (внешние ключи ссылаются на первичный ключ другой таблицы).
Для ускорения поиска и манипуляций с данными за счёт создания индекса на столбец первичного ключа.

🚩Пример использования Primary Key

Простой первичный ключ
CREATE TABLE Users (
user_id INT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(100)
);


Составной первичный ключ
CREATE TABLE Orders (
order_id INT,
product_id INT,
PRIMARY KEY (order_id, product_id)
);


Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое Web application?

Web application (веб-приложение) — это программное приложение, которое работает на веб-сервере и доступно пользователям через веб-браузер с использованием сети (например, Интернета). Примеры: интернет-магазины, почтовые клиенты, CRM-системы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊4
🤔 Чем stub отличается от mock?

В тестировании разница между Stub и Mock заключается в их предназначении и способе использования.

🚩Stub (Заглушка)

Stub – это простейший объект-заглушка, который возвращает заранее заданные данные. Он не проверяет, какие методы были вызваны, а просто отвечает на запросы.
class UserRepositoryStub implements UserRepository {
@Override
public User findById(Long id) {
return new User(id, "Иван"); // Просто возвращает статичные данные
}
}


🚩Mock (Макет)

Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.).
UserRepository userRepository = mock(UserRepository.class);
when(userRepository.findById(1L)).thenReturn(new User(1L, "Иван"));

User user = userRepository.findById(1L);

verify(userRepository, times(1)).findById(1L); // Проверяем, что метод был вызван 1 раз


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Что такое HQL?

HQL (Hibernate Query Language) — это язык запросов, похожий на SQL, но оперирующий Java-классами и их свойствами, а не таблицами и колонками. Он позволяет работать с объектной моделью и использовать возможности Hibernate ORM.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍4
🤔 Что за исключение Interrupted Exception?

InterruptedException — это проверяемое исключение (checked exception) в Java, которое выбрасывается, когда поток (Thread) прерывается во время выполнения метода, который поддерживает прерывание (например, sleep(), wait(), join() и др.).

🚩Почему `InterruptedException` существует?

В многопоточной среде иногда требуется прервать выполнение потока, например, для завершения долгой задачи или для корректной остановки программы. Вместо грубого завершения потока (Thread.stop(), который устарел и считается небезопасным) Java предлагает мягкий способ прерывания через флаг прерывания и обработку InterruptedException.

🚩Когда выбрасывается `InterruptedException`?

Это исключение выбрасывается, если поток:
1. Ожидает (wait(), join())
2. Спит (sleep())
3. Блокируется на очереди (BlockingQueue.take(), LockSupport.park())
И при этом его прерывают с помощью метода interrupt().

Пример кода: обработка InterruptedException
class MyThread extends Thread {
public void run() {
try {
System.out.println("Поток засыпает...");
Thread.sleep(5000); // Поток засыпает на 5 секунд
} catch (InterruptedException e) {
System.out.println("Поток был прерван во время сна!");
}
System.out.println("Поток продолжает работу...");
}
}

public class Main {
public static void main(String[] args) {
MyThread t = new MyThread();
t.start();

try {
Thread.sleep(2000); // Даем потоку 2 секунды поработать
} catch (InterruptedException e) {
e.printStackTrace();
}

t.interrupt(); // Прерываем поток
}
}


Вывод программы
Поток засыпает...
Поток был прерван во время сна!
Поток продолжает работу...


🚩Что делать после `InterruptedException`?

1. Просто обработать исключение (как в примере выше).
2. Передать исключение дальше — например, если метод не может корректно обработать прерывание, он передает его вызывающему коду:
   void myMethod() throws InterruptedException {
Thread.sleep(1000); // Может выбросить исключение
}


🟠Восстановить флаг прерывания
если прерывание важно для логики программы:
   catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Восстанавливаем флаг прерывания
}


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Чем отличаются HashSet и LinkedHashSet?

- HashSet:
- Быстрая вставка и поиск.
- Не сохраняет порядок элементов.
- LinkedHashSet:
- Также использует хеш-таблицу.
- Сохраняет порядок вставки элементов.
Выбирают в зависимости от требований к порядку.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Как ты можешь описать абстракцию?

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

🚩Абстракция

В Java абстракция достигается через:
Абстрактные классы
Интерфейсы

🟠Абстрактные классы
Абстрактный класс — это класс, который не может быть создан напрямую, но может содержать:
Абстрактные методы (без реализации, только сигнатуры);
Обычные методы (с реализацией).
Используется, если вы хотите описать общее поведение для группы классов, но часть поведения оставить на усмотрение конкретных подклассов.
abstract class Animal {
// Абстрактный метод — реализуется в подклассах
abstract void makeSound();

// Обычный метод
void eat() {
System.out.println("This animal eats food.");
}
}

class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Woof!");
}
}

class Cat extends Animal {
@Override
void makeSound() {
System.out.println("Meow!");
}
}

public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
dog.makeSound(); // Woof!
dog.eat(); // This animal eats food.

Animal cat = new Cat();
cat.makeSound(); // Meow!
}
}


🟠Интерфейсы
Интерфейс — это чистый контракт, который определяет набор методов, которые класс должен реализовать.
В отличие от абстрактного класса:
Интерфейс не может содержать полей (кроме static final).
Класс может реализовать несколько интерфейсов (множественное наследование).
interface Vehicle {
void start(); // метод без реализации
void stop();
}

class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car is starting.");
}

@Override
public void stop() {
System.out.println("Car is stopping.");
}
}

class Bike implements Vehicle {
@Override
public void start() {
System.out.println("Bike is starting.");
}

@Override
public void stop() {
System.out.println("Bike is stopping.");
}
}

public class Main {
public static void main(String[] args) {
Vehicle car = new Car();
car.start(); // Car is starting.
car.stop(); // Car is stopping.

Vehicle bike = new Bike();
bike.start(); // Bike is starting.
bike.stop(); // Bike is stopping.
}
}


🚩Почему важна абстракция?

🟠Скрытие сложностей
Программистам не нужно знать все детали реализации объекта. Они работают только с его интерфейсом.
🟠Упрощение понимания
Код становится понятным и модульным, так как мы сосредоточиваемся на важной логике.
🟠Повторное использование
Абстракция позволяет использовать один и тот же код для разных объектов.
🟠Гибкость и поддержка
Если нужно изменить реализацию, это не затронет остальную часть программы (если она работает через абстрактный контракт).

Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое livelock?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5🔥1