TGViewer
Channel Public Channel
Java | Вопросы собесов

Java | Вопросы собесов

@easy_java_ru

Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @easyoffer_adv
Subscribers
11.3K
Photos
37
Videos
4
Links
1.6K

Showing posts older than #2503 · Back to latest

Older Posts 20 shown
Post #2501 1.87K
🤔 Что известно про концепцию класса CompletableFuture?

CompletableFuture — это асинхронная альтернатива Future:
- Позволяет цепочку асинхронных операций;
- Поддерживает объединение, обработку ошибок;
- Использует ForkJoinPool или кастомный Executor;
- Предназначен для реактивного и неблокирующего программирования.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 4
  • 👍 2
Post #2499 2.19K
🤔 Как работает Spring "под капотом"?

Spring работает на основе контейнера Inversion of Control (IoC):
- создаёт объекты и управляет их жизненным циклом;
- внедряет зависимости через
@Autowired, @Inject, @Configuration;
- сканирует классы и аннотации, строит контекст приложения (ApplicationContext);
- в случае Spring Boot — автоматически конфигурирует многие компоненты (автоконфигурация).
Также Spring использует прокси, аспекты (AOP), и активно взаимодействует с BeanPostProcessor для расширения поведения бинов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 10
  • 🔥 3
Post #2497 2.03K
🤔 Какая идея в Обобщениях (Generic)?

Generics позволяют писать гибкий и типобезопасный код. Они позволяют использовать тип как параметр, чтобы не дублировать один и тот же код под разные типы.
Основные цели:
- Типовая безопасность без кастов.
- Переиспользуемость кода.
- Упрощение чтения и поддержки.
Пример: один и тот же список может хранить Integer, String, User — и компилятор проверит тип.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 11
  • 🔥 1
Post #2495 2.08K
🤔 В чем разница между Spring аннотациями Component, Repository и Service?

Все три аннотации используются в Spring для создания бинов, но у каждой есть своё предназначение.

🚩`@Component` – базовая аннотация для бина

@Component помечает класс как Spring-бин (компонент).
Является универсальной аннотацией.
Можно применять к любым классам, которые должны управляться Spring-контейнером.
@Component
public class MyComponent {
public void doWork() {
System.out.println("Работа компонента");
}
}


🚩`@Service` – для бизнес-логики

@Service – это специализированный @Component, используемый для сервисных классов (логика приложения).
Упрощает понимание кода (показывает, что этот класс содержит бизнес-логику).
@Service
public class UserService {
public String getUser() {
return "Пользователь Иван";
}
}


🚩`@Repository` – для работы с базой данных

@Repository – это специализированный @Component для слоя доступа к данным (DAO, Repository).
Автоматически перехватывает SQL-исключения (PersistenceExceptionTranslationPostProcessor) и преобразует их в DataAccessException.
@Repository
public class UserRepository {
public String findUserById(int id) {
return "Пользователь с ID " + id;
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 9
Post #2493 1.97K
🤔 Что означает симметричность?

Симметричность — это свойство, при котором если a связано с b, то b связано с a. Например, в контексте equals() это означает: a.equals(b) → b.equals(a).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 4
  • 💊 2
Post #2491 2.17K
🤔 Что такое связанный список как структура данных?

Связанный список — это структура, состоящая из узлов (элементов), каждый из которых содержит:
- данные;
- указатель на следующий узел (в односвязном);
- и (в двусвязном) — на предыдущий узел.
Преимущества:
- Быстрая вставка и удаление на любом участке (без сдвига). Недостатки:
- Доступ к элементам возможен только последовательно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 9
Post #2489 1.93K
🤔 Какая политика в Hibernate для коллекций?

По умолчанию:
- Используется LAZY загрузка коллекций.
- Коллекции могут быть List, Set, Map.
- Поведение можно изменить через
@OneToMany(fetch = FetchType.EAGER) и аналогично для других связей.
Также можно управлять каскадом операций через cascade = {CascadeType.ALL}.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 12
  • 🔥 2
Post #2488 2.37K
🤔 Какой цикл жизни Spring Beans?

Каждый бин (компонент) проходит через жизненный цикл, который начинается с его создания и заканчивается уничтожением. Этот цикл включает в себя ряд этапов, на которых он предоставляет различные точки для настройки поведения бина. Вот основные этапы жизненного цикла:

🟠Инстанцирование бина
Создает экземпляр бина из класса определения бина.

🟠Заполнение свойств бина
Внедряет значения и ссылки на другие бины в свойства текущего бина, используя конфигурацию, заданную в XML, аннотациях или конфигурации.

🟠Вызов методов жизненного цикла BeanNameAware
Если бин реализует один из Aware интерфейсов, он вызывает соответствующие методы, передавая экземпляру бина ссылку на контекст, фабрику бинов и т.д.

🟠Post-Processing Bean
Перед инициализацией бина, он дает возможность BeanPostProcessor'ам обработать объект. Это может быть использовано для проксирования бинов или для иной предварительной обработки.

🟠Вызов метода инициализации
Если для бина определен метод инициализации (через аннотацию @PostConstruct, интерфейс InitializingBean или атрибут init-method в XML-конфигурации), он вызывает его после того, как все свойства бина были установлены.

🟠Готовность к использованию
После вызова метода инициализации бин полностью инициализирован и готов к использованию в приложении.

🟠Вызов метода уничтожения
Когда контекст приложения закрывается, и бины должны быть уничтожены, он вызывает метод уничтожения для бинов, которые определяют его (через аннотацию @PreDestroy, интерфейс DisposableBean или атрибут destroy-method в XML-конфигурации).

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 7
Post #2487 2K
🤔 Почему нельзя сравнивать объекты через «==»?

Оператор == сравнивает ссылки на объекты, а не их содержимое, поэтому результат может быть некорректным для объектов с одинаковыми данными.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 16
  • 💊 3
  • 🤔 1
Post #2486 2.22K
🤔 Почему нельзя использовать byte[] в качестве ключа в HashMap?

Потому что byte[]:
- не переопределяет equals и hashCode, унаследованные от Object;
- сравнивается по ссылке, а не по содержимому;
- даже если два массива содержат одни и те же байты — equals() вернёт false.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 8
  • 👍 2
  • 💊 2
Post #2484 2.25K
🤔 Что такое функциональный интерфейс?

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

Примером этого может служить интерфейс java.util.function.Predicate<T> который принимает объект типа T и возвращает значение типа boolean. Вот пример использования:
Predicate<String> isNotEmpty = s -> !s.isEmpty();
System.out.println(isNotEmpty.test("Hello")); // Выведет true
System.out.println(isNotEmpty.test("")); // Выведет false


Чтобы явно указать, что интерфейс предназначен для использования как функциональный, используется аннотация @FunctionalInterface. Эта аннотация не обязательна (компилятор может определить функциональный интерфейс и без неё), но она помогает в документировании кода и обеспечивает проверку времени компиляции, гарантируя, что интерфейс содержит только один абстрактный метод.
@FunctionalInterface
public interface SimpleFunction {
int apply(int value);
}

// Использование
SimpleFunction triple = value -> value * 3;
System.out.println(triple.apply(5)); // Выведет 15


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 6
Post #2482 1.92K
🤔 Какие два основных участка памяти для хранения данных есть?

Существует два главных участка памяти: стек и куча. Стек используется для хранения локальных переменных и ссылок на объекты. Он работает по принципу LIFO и очищается автоматически при выходе из метода. Куча, в свою очередь, предназначена для хранения объектов, которые создаются во время выполнения программы и могут существовать дольше, чем вызов одного метода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 6
  • 🔥 4
Post #2480 1.97K
🤔 Что такое Request Dispatcher?

1. Request Dispatcher — это интерфейс, который позволяет передавать запрос другому ресурсу (сервлету, JSP) или включать его ответ в текущий.
2. Используется методы forward() для перенаправления и include() для включения ответа в текущий поток.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 6
  • 👍 4
  • 💊 1
Post #2479 2.07K
Post #2478 1.82K
🤔 Роль `serialVersionUID` в сериализации

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

🚩Почему `serialVersionUID` важен?

🟠Гарантия совместимости при десериализации
Когда объект сериализуется (превращается в поток байтов), вместе с ним сохраняется и serialVersionUID. При десериализации JVM сравнивает serialVersionUID сохранённого объекта с serialVersionUID текущего класса. Если они не совпадают, выбрасывается исключение InvalidClassException, так как структура класса могла измениться.

🟠Предотвращение ошибок при изменениях класса
Если класс изменяется (например, добавляется новое поле), но serialVersionUID остаётся неизменным, JVM считает, что класс всё ещё совместим с более старой версией, и десериализация проходит успешно.

🟠Явное управление версиями
Если serialVersionUID не указан явно, JVM генерирует его автоматически на основе структуры класса. Это может привести к неожиданным проблемам, если класс изменится, так как автоматически вычисленный serialVersionUID изменится.

🚩Как использовать `serialVersionUID`?

import java.io.*;

class Person implements Serializable {
private static final long serialVersionUID = 1L; // Версия класса
private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}


🚩Что будет, если не указать `serialVersionUID`?

Если не определить serialVersionUID, JVM сгенерирует его автоматически. Однако:
Он будет зависеть от структуры класса.
Малейшее изменение в коде (даже порядок методов) изменит serialVersionUID.
Это может привести к InvalidClassException при десериализации.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 7
Post #2477 1.63K
🤔 Что известно о том, как надо реализовывать equals()?

При реализации:
1. Проверить this == obj.
2. Проверить obj == null.
3. Сравнить классы.
4. Привести к нужному типу.
5. Сравнить поля (обычно те, что участвуют в hashCode).
Также нужно переопределить hashCode(), чтобы правило контрактов соблюдалось.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 7
  • 🔥 3
Post #2475 1.81K
🤔 Что такое адаптер?

Адаптер (Adapter) – это шаблон проектирования, который используется для приведения интерфейсов несовместимых классов к единому виду. Он выступает посредником между двумя несовместимыми системами.

🚩Пример: Адаптер в Java (Object Adapter)
Допустим, у нас есть старый класс OldCharger, который работает с вольтажем 220V, а мы хотим, чтобы он работал с USB (5V).
Старый интерфейс (неподходящий)
class OldCharger {
void charge220V() {
System.out.println("Зарядка 220V...");
}
}


Новый интерфейс (нужный)
interface USBCharger {
void charge5V();
}


Адаптер, который превращает 220V в 5V
class ChargerAdapter implements USBCharger {
private OldCharger oldCharger;

public ChargerAdapter(OldCharger oldCharger) {
this.oldCharger = oldCharger;
}

@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
oldCharger.charge220V();
}
}


Использование адаптера
public class Main {
public static void main(String[] args) {
OldCharger oldCharger = new OldCharger();
USBCharger adapter = new ChargerAdapter(oldCharger);

adapter.charge5V(); // Теперь старая зарядка работает с 5V!
}
}


Object Adapter (адаптер-объект) – использует композицию (пример выше).
Class Adapter (адаптер-класс) – использует наследование (extends).
class ChargerAdapter extends OldCharger implements USBCharger {
@Override
public void charge5V() {
System.out.println("Преобразуем 220V в 5V...");
charge220V();
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 7
Post #2470 1.9K
🤔 ArrayList, какая скорость доступа к последнему элементу?

Константная. ArrayList использует массив, поэтому доступ по индексу, включая последний элемент, осуществляется очень быстро.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 13
  • 🔥 4
  • 🤔 1
Post #2468 2.35K
🤔 Как остановить поток?

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

🚩Плохие способы (НЕ рекомендуется)

Раньше использовался метод Thread.stop(), но он был устаревшим и удалённым из-за того, что мог оставить программу в неконсистентном состоянии.
Thread thread = new Thread(() -> {
while (true) {
System.out.println("Работаю...");
}
});

thread.start();
thread.stop(); // ОПАСНО! Может привести к некорректному завершению работы.


🚩Флаг завершения работы (рекомендуемый способ)
Самый безопасный способ – это использование флага (volatile boolean).
class MyTask implements Runnable {
private volatile boolean running = true;

public void run() {
while (running) {
System.out.println("Работаю...");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // Важно восстанавливать флаг прерывания
}
}
System.out.println("Поток остановлен.");
}

public void stop() {
running = false;
}
}

public class Main {
public static void main(String[] args) throws InterruptedException {
MyTask task = new MyTask();
Thread thread = new Thread(task);
thread.start();

Thread.sleep(2000);
task.stop(); // Корректно останавливаем поток
}
}


🚩Прерывание потока (`interrupt()`)

Этот способ удобен для потоков, которые ждут (sleep(), wait(), join()), потому что прерывание выбрасывает InterruptedException.
class MyTask implements Runnable {
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Работаю...");
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Поток прерван.");
}
}
}

public class Main {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new MyTask());
thread.start();

Thread.sleep(2000);
thread.interrupt(); // Прерывание потока
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 5
Post #2464 4.39K
🤔 Что такое as-if-serial semantics?

As-If-Serial Semantics – это принцип оптимизации компилятором, при котором код может перестраиваться, но результат его выполнения остаётся таким же, как если бы инструкции выполнялись строго по порядку.

Обычный код
int a = 10;
int b = 20;
int c = a + b;
System.out.println(c);


Что может сделать компилятор?
int c = 30;
System.out.println(c);


🚩Что можно менять? (Безопасные оптимизации)

Менять порядок инструкций, если это не влияет на результат.
Удалять лишние переменные и вычисления.
Заменять выражения константами (10 + 20 → 30).
int x = 5;
int y = 10;
x = x + 1; // x = 6
System.out.println(y);


Компилятор может поменять местами y и x
int y = 10;
int x = 6;
System.out.println(y);


🚩Что нельзя менять? (Гарантированный порядок исполнения)

int x = 10;
int y = x + 5;
x = 20;
System.out.println(y);


Если поменять порядок
x = 20;
int y = x + 5; // ❌ Неверно! y теперь 25, а должно быть 15


🚩Как `As-If-Serial` влияет на многопоточность?

В многопоточной среде компилятор может менять порядок команд внутри одного потока, но он не знает о другом потоке!
Опасный пример без volatile
boolean ready = false;
int data = 0;

void writer() {
data = 42;
ready = true;
}

void reader() {
if (ready) {
System.out.println(data); // Может напечатать 0 из-за перестановки!
}
}


Решение – volatile для ready
volatile boolean ready = false;


Ставь 👍 и забирай 📚 Базу знаний
  • 🔥 6
  • 👍 4
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →