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

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Что такое heap, stack?

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

🚩Heap (Куча)

Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора new, размещаются в куче.

🟠Особенности
Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation).
Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1).
Старое поколение хранит долгоживущие объекты.

🟠Управление памятью
Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются.

🟠Использование
Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.

public class Example {
public static void main(String[] args) {
Example obj = new Example(); // obj создается в куче
}
}


🚩Stack (Стек)

Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах.

🟠Особенности
Каждый поток имеет свой собственный стек.
Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах.

🟠Управление памятью
Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека.

🟠Использование
Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче.
Локальные переменные методов и параметры методов хранятся в стеке.

public class Example {
public static void main(String[] args) {
int localVar = 10; // localVar хранится в стеке
Example obj = new Example(); // Ссылка на obj хранится в стеке, а сам объект — в куче
obj.method();
}

public void method() {
int anotherVar = 20; // anotherVar хранится в стеке
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍4
🤔 Перечисли принципы, которым вы следуете в многопоточном программировании.

- Минимизировать общение между потоками;
- Использовать высокоуровневые примитивы (Executors, Locks, Concurrent collections);
- Предпочитать неизменяемость;
- Чётко проектировать критические секции;
- Обрабатывать прерывания правильно;
- Стараться избегать блокировок и deadlock-ов.


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

В интерфейсе могут располагаться различные типы методов, начиная с Java 8, когда в язык были добавлены новые возможности, такие как default методы и static методы. До Java 8 интерфейсы могли содержать только абстрактные методы. Ниже представлены типы методов, которые могут быть объявлены в интерфейсе:

🟠Абстрактные методы
Это методы без тела, предназначенные для переопределения в классах, которые реализуют интерфейс. Абстрактные методы представляют собой контракт, который должен быть выполнен классом-реализатором. Все методы в интерфейсе неявно являются public abstract, даже если явно не указаны эти модификаторы.
void myMethod();


🟠Default методы (начиная с Java 8)
Позволяют определять реализацию метода непосредственно в интерфейсе. Классы, реализующие интерфейс, могут переопределять эти методы, но это не обязательно. Default методы были введены для обеспечения обратной совместимости, позволяя добавлять новые методы в интерфейсы без нарушения существующих реализаций.
default void defaultMethod() {
// Реализация
}


🟠Static методы (начиная с Java 8)
Позволяют определять методы с реализацией, которые могут быть вызваны без создания экземпляра класса, реализующего интерфейс. Эти методы нельзя переопределить в реализующем интерфейс классе.
static void staticMethod() {
// Реализация
}


🟠Private методы (начиная с Java 9)
Позволяют определять вспомогательные методы, которые предназначены для использования в default или static методах внутри того же интерфейса. Эти методы не могут быть вызваны извне интерфейса или реализующих его классов.
private void privateMethod() {
// Реализация
}


Пример
public interface MyInterface {
// Абстрактный метод
void abstractMethod();

// Default метод
default void defaultMethod() {
System.out.println("Default implementation");
}

// Static метод
static void staticMethod() {
System.out.println("Static implementation");
}

// Private метод (используется внутри интерфейса)
private void privateMethod() {
System.out.println("Private helper method");
}
}


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

- DOM (Document Object Model): загружает весь XML в память в виде дерева.
Плюсы: лёгкий доступ к любому узлу; Минусы: высокая потребляемая память при больших файлах.
- SAX (Simple API for XML): событийный парсер, обрабатывает XML последовательно.
Плюсы: низкое потребление памяти; Минусы: нет прямого доступа к элементам, труднее работать.
- StAX (Streaming API for XML): потоковый парсер с возможностью контролировать чтение.
Плюсы: баланс между SAX и DOM, лучше управляем поток; Минусы: сложнее логика обработки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6👍1
🤔 Обеспечит ли Stream API RandomAcess?

Нет, Stream API не поддерживает RandomAccess, потому что он работает с потоком данных, а не с индексированными структурами.

🚩Почему Stream API не поддерживает `RandomAccess`?

🟠Stream – это поток данных
который не обязательно хранится в памяти в виде структуры, поддерживающей случайный доступ.
🟠Нет индексов
в отличие от List, Stream не позволяет получить элемент по индексу (get(index) отсутствует).
🟠Обход последовательный
элементы проходятся один за другим, что делает случайный доступ невозможным.

List (с RandomAccess)
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
System.out.println(list.get(2)); // Быстрое получение элемента по индексу


Stream (без RandomAccess)
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
stream.skip(2).findFirst().ifPresent(System.out::println); // Ищем 3-й элемент


Ставь 👍 и забирай 📚 Базу знаний
👍5
🤔 Что стоит в центре парадигмы?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊16🤔4👍1
🤔 Чем отличаются методы Thread.sleep() и Thread.yield()?

Методы Thread.sleep() и Thread.yield() в Java используются для управления потоком, но работают по-разному.

🚩Thread.sleep()

Метод Thread.sleep(milliseconds) приостанавливает выполнение текущего потока на указанное время.

🚩Как это работает?

Поток уходит в состояние "ожидания" (TIMED_WAITING).
Операционная система не даёт ему процессорное время в течение заданного времени.
После завершения паузы поток снова становится готовым к выполнению (RUNNABLE).

public class SleepExample {
public static void main(String[] args) {
System.out.println("Начало работы...");
try {
Thread.sleep(2000); // Пауза на 2 секунды
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Прошло 2 секунды");
}
}


Результат
Начало работы...
(пауза 2 секунды)
Прошло 2 секунды


🚩Thread.yield()

Метод Thread.yield() даёт возможность другим потокам выполнить работу.

🚩Как это работает?

Текущий поток передаёт управление планировщику (scheduler).
Если есть другие потоки с таким же или более высоким приоритетом, они получат процессорное время.
Если таких потоков нет, то текущий поток продолжит выполняться.

public class YieldExample {
public static void main(String[] args) {
Runnable task = () -> {
for (int i = 1; i <= 5; i++) {
System.out.println(Thread.currentThread().getName() + " - " + i);
Thread.yield(); // Позволяет другим потокам выполняться
}
};

Thread t1 = new Thread(task, "Поток-1");
Thread t2 = new Thread(task, "Поток-2");

t1.start();
t2.start();
}
}


Результат (примерный, зависит от планировщика ОС)
Поток-1 - 1
Поток-2 - 1
Поток-1 - 2
Поток-2 - 2
...


Ставь 👍 и забирай 📚 Базу знаний
👍2
🤔 Для чего используется оператор ORDER BY?

ORDER BY используется для сортировки результата запроса по одному или нескольким столбцам:
- по возрастанию (ASC) или убыванию (DESC);
- может использовать индексы (при наличии).
Без ORDER BY СУБД не гарантирует порядок строк в ответе.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Чем полезны неизменяемые (Immutable) объекты в Java?

Неизменяемые (immutable) объекты не могут быть изменены после создания.
Если нужно изменить данные – создаётся новый объект.

🚩Почему неизменяемые объекты полезны?

🟠Потокобезопасность (Thread Safety)
Неизменяемые объекты можно безопасно использовать в многопоточной среде – их не нужно синхронизировать.
String message = "Hello";
String newMessage = message.replace("H", "J");

System.out.println(message); // Hello
System.out.println(newMessage); // Jello


🟠Отсутствие неожиданных изменений (безопасность данных)
Если объект неизменяемый, его нельзя случайно изменить.
class BankAccount {
private final String accountNumber;

public BankAccount(String accountNumber) {
this.accountNumber = accountNumber;
}

public String getAccountNumber() {
return accountNumber;
}
}


🟠Упрощает отладку и поддержку кода
Изменяемые объекты могут менять состояние в неожиданный момент.
List<String> list = new ArrayList<>();
list.add("Java");

modifyList(list); // Метод может изменить список!

System.out.println(list); // Ожидаем ["Java"], но может быть что угодно!


🟠Можно использовать в качестве ключей в `HashMap` и `HashSet`
Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в HashMap.
Map<String, String> map = new HashMap<>();
map.put("key", "value");

System.out.println(map.get("key")); // Всегда "value", так как String неизменяемый


🟠Совместимость с кэшем (например, в Hibernate, Spring)
Неизменяемые объекты можно безопасно кешировать, так как они не меняются.

🚩Как создать неизменяемый класс?

Все поля private final.
Нет сеттеров.
Если есть массивы или списки – копируем их перед возвратом.
final class Person {
private final String name;
private final int age;

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

public String getName() {
return name;
}

public int getAge() {
return age;
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 Что известно про особое свойство React?

- Компонентность: интерфейс разбит на переиспользуемые компоненты;
- Однонаправленный поток данных (props → down);
- JSX — декларативный синтаксис, близкий к HTML, но с возможностями JS;
- Виртуальный DOM — ключ к высокой производительности;
- Хуки — способ управлять состоянием и побочными эффектами в функциональных компонентах.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊12
🤔 В чем разница между Statement и PreparedStatement?

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

🚩Statement

Statement используется для выполнения простых SQL-запросов. Запросы формируются и передаются в базу данных в виде строки. Подходит для простых запросов. Не оптимизирован для повторного выполнения. Каждый раз, когда запрос передается в базу данных, он компилируется и выполняется заново. Уязвим к SQL-инъекциям. Поскольку запрос формируется путем конкатенации строк, злоумышленники могут внедрять вредоносный SQL-код.
Statement stmt = connection.createStatement();
String query = "SELECT * FROM employees WHERE department = 'HR'";
ResultSet rs = stmt.executeQuery(query);

while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
stmt.close();


🟠PreparedStatement
PreparedStatement используется для выполнения предварительно скомпилированных SQL-запросов. Это позволяет повысить производительность и безопасность. Оптимизирован для повторного выполнения. Запрос компилируется только один раз, а затем может многократно выполняться с разными параметрами, что повышает производительность. Защита от SQL-инъекций. Использует параметризованные запросы, которые помогают избежать уязвимостей, связанных с SQL-инъекциями. Удобство работы с параметрами. Позволяет устанавливать значения параметров с использованием методов setInt(), setString() и других.
String query = "SELECT * FROM employees WHERE department = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, "HR");
ResultSet rs = pstmt.executeQuery();

while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
pstmt.close();


🚩Основные различия

🟠Производительность
Statement: Каждый запрос компилируется заново, что снижает производительность при многократном выполнении одного и того же запроса.
PreparedStatement: Запрос компилируется один раз и может многократно выполняться с разными параметрами, что повышает производительность.
🟠Безопасность
Statement: Уязвим к SQL-инъекциям, поскольку запросы формируются путем конкатенации строк.
PreparedStatement: Использует параметризованные запросы, что защищает от SQL-инъекций.
🟠Удобство использования
Statement: Подходит для простых, одноразовых запросов.
PreparedStatement: Удобен для многократного выполнения запросов с разными параметрами.
🟠Типы запросов
Оба интерфейса могут выполнять запросы типа SELECT, INSERT, UPDATE, DELETE, но PreparedStatement более удобен для запросов с параметрами.

Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Что такое ключевое слово final?

final используется для:
1. Классов: предотвращает наследование.
2. Методов: предотвращает переопределение.
3. Переменных: значение не может быть изменено после инициализации.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍6
🤔 Какая коллекция реализует дисциплину обслуживания FIFO?

FIFO (First-In, First-Out) – это принцип обработки данных: "первым вошёл – первым вышел".

🟠Коллекции, реализующие FIFO
Пример работы FIFO с Queue
import java.util.*;

public class FifoExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>(); // Можно заменить на ArrayDeque

queue.add("Первый");
queue.add("Второй");
queue.add("Третий");

System.out.println(queue.poll()); // Первый
System.out.println(queue.poll()); // Второй
System.out.println(queue.poll()); // Третий
}
}


🟠Разница `poll()`, `remove()` и `peek()`
Queue<Integer> queue = new LinkedList<>();
queue.add(10);
System.out.println(queue.peek()); // 10 (но не удаляет)
System.out.println(queue.poll()); // 10 (удаляет)
System.out.println(queue.poll()); // null (очередь пуста)


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

1. Ссылка на статический метод — ClassName::staticMethod;
2. Ссылка на метод экземпляра конкретного объекта — object::instanceMethod;
3. Ссылка на метод экземпляра произвольного объекта типа — ClassName::instanceMethod;
4. Ссылка на конструктор — ClassName::new.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥5👍2
🤔 В чем разница между 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;
}
}


Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какие есть виды Stream?

- Sequential Stream — последовательно обрабатывает элементы;
- Parallel Stream — использует многопоточность для ускорения обработки;
- Infinite Stream — поток без конца (например, генерация случайных чисел).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🔥6👍1🤔1
🤔 Как найти ошибку в программе?

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

1⃣Понимание ошибки
Симптомы ошибки: Программа выдает ошибочное поведение, например, неожиданный результат, исключение или сбой.
Типы ошибок:
Синтаксические: Ошибки в написании кода (например, пропущенная точка с запятой).
Логические: Код выполняется без ошибок, но результат не соответствует ожиданиям.
Ошибки выполнения: Программа завершает работу из-за исключения (например, деление на ноль).

2⃣Использование сообщений об ошибках
Компилятор/интерпретатор: Сообщает о синтаксических ошибках и указывает строку, где возникла проблема.
Стек вызовов (stack trace): Для ошибок выполнения предоставляет информацию о том, где произошла ошибка.
Пример:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)


3⃣Ручное исследование кода
Прочитайте проблемный участок кода и проверьте его на соответствие логике задачи.
Ищите типичные ошибки, такие как:
Неправильное использование переменных.
Ошибки в условных операторах (if, switch).
Пропущенные или лишние элементы кода.

4⃣Использование инструментов отладки
Отладчик (Debugger):
Отладчики встроены в IDE, такие как IntelliJ IDEA, Eclipse или NetBeans.
Позволяют ставить точки останова (breakpoints), чтобы программа останавливалась в конкретных местах.
Позволяют пошагово выполнять код и проверять значения переменных.
Логирование (Logging):
Используйте System.out.println для вывода промежуточных данных:

       System.out.println("Value of x: " + x);


Пример

     import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);

public static void main(String[] args) {
int x = 10;
int y = 0;
try {
int result = x / y;
} catch (ArithmeticException e) {
logger.error("Division by zero!", e);
}
}
}


5⃣Тестирование
Покрытие тестами: Напишите автоматические тесты для выявления ошибки.
Используйте фреймворки, такие как JUnit или TestNG.

       import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class CalculatorTest {
@Test
void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}
}


6⃣Анализ чужого кода
Если ошибка в сторонней библиотеке, проверьте документацию и известные проблемы. Убедитесь, что вы правильно используете методы и классы.

7⃣Рефакторинг и исправление
Исправьте ошибку, убедившись, что исправление не приводит к новым ошибкам. Проверьте весь код на предмет аналогичных ошибок.

Ставь 👍 и забирай 📚 Базу знаний
👍3
🤔 Какой жизненный цикл Maven?

Жизненный цикл Maven состоит из стадий:
1. validate — проверка проекта.
2. compile — компиляция исходников.
3. test — запуск тестов.
4. package — упаковка (например, в .jar).
5. verify — проверка результата.
6. install — установка в локальный репозиторий.
7. deploy — публикация в удалённый репозиторий.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
💊6👍2🔥2
🤔 В чем разница 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
🤔 Какие виды join знаешь?

Существуют такие виды JOIN, как INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN и CROSS JOIN, каждый из которых используется для специфического метода соединения таблиц в базе данных

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