Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
32 photos
2 videos
1.13K links
Download Telegram
🤔 Какие существуют уровни модели OSI?

Модель OSI включает семь уровней:
1. Физический уровень
2. Канальный уровень
3. Сетевой уровень
4. Транспортный уровень
5. Сеансовый уровень
6. Представительный уровень
7. Прикладной уровень


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥4🤔1
🤔 Какие минусы Rest в высоконагруженных сис-мах?

REST – это удобный и популярный архитектурный стиль, но в высоконагруженных системах у него есть недостатки.

🚩Высокие накладные расходы HTTP (избыточность)

Проблема: Каждый REST-запрос передаёт много мета-информации (заголовки, cookies, CORS, JSON/XML).
GET /users/123 HTTP/1.1
Host: api.example.com
Authorization: Bearer token123
Content-Type: application/json


В WebSocket/gRPC запрос выглядел бы так
{ "userId": 123 }


🚩REST-запросы неэффективны для чатов и real-time

Проблема: REST использует "запрос-ответ", но **не поддерживает real-time.

Что происходит в REST?
1. Клиент делает HTTP-запрос к серверу.
2. Сервер обрабатывает и отправляет ответ.
3. Если клиенту нужно новое сообщение, он снова делает запрос (Polling) или использует Long Polling.

🚩Проблемы с кэшированием

Проблема: Не все REST-запросы можно кэшировать.
Кэшируются только GET-запросы (если сервер поддерживает ETag и Cache-Control).
POST, PUT, DELETE – не кэшируются, потому что меняют данные.

🚩REST API неэффективен для сложных запросов

Проблема: REST требует много отдельных запросов, если нужно загрузить связанные данные.
Пример проблемы REST:
Получить пользователя: /users/123
Получить заказы этого пользователя: /users/123/orders
Получить детали заказов: /orders/456/details

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16💊1
🤔 Для чего нужен BiPredicate<T, U>?

Проверяет условие на двух параметрах, возвращает boolean. Пример — сравнение двух строк или валидация пары значений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥2
🤔 Что такое синхронизация и зачем она нужна?

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

🚩Зачем она нужна

🟠Предотвращение гонки данных (race conditions)
Гонка данных возникает, когда два или более потоков одновременно пытаются изменить общие данные, и результат выполнения зависит от того, в каком порядке потоки выполняют операции. Синхронизация помогает управлять доступом к данным таким образом, чтобы обеспечить их целостность.

🟠Обеспечение видимости изменений
В многопоточной среде изменения, сделанные одним потоком в общем ресурсе, могут не быть сразу видны другим потокам из-за кэширования данных в процессорах или оптимизаций компилятора. Синхронизация гарантирует, что изменения, сделанные одним потоком, будут корректно видны другим потокам.

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

🚩Как она реализуется

🟠Ключевое слово synchronized
Может использоваться для блокировки целого метода или определённого блока кода, обеспечивая монопольный доступ к этому участку кода для одного потока одновременно.

🟠Явные блокировки с использованием классов из пакета java.util.concurrent.locks
Предоставляют более гибкие возможности для управления блокировками, включая попытку захвата блокировки без ожидания, захват прерываемых блокировок и блокировки с возможностью повторного входа.

🟠Волатильные переменные (volatile)
Обеспечивают видимость изменений переменных между разными потоками, но не контролируют последовательность доступа к переменной.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Что такое асинхронные сообщения?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥3
🤔 Какой цикл жизни Spring Beans?

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

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

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

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

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

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

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

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

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥1
🤔 Какое худшее время работы метода get(key) для ключа, который есть в HashMap?

Также O(n) — при множестве коллизий и плохой хеш-функции, все элементы могут оказаться в одной цепочке.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4
🤔 Каким образом можно заставить поток выполнится приоритет и есть ли такая возможность в Java?

В Java у каждого потока есть приоритет, но он не гарантирует порядок выполнения.

🟠Использование `setPriority(int priority)`
Java позволяет задавать приоритет потока с помощью метода setPriority(), который принимает значение от 1 до 10:
Thread.MIN_PRIORITY (1) – минимальный приоритет
Thread.NORM_PRIORITY (5) – стандартный приоритет (по умолчанию)
Thread.MAX_PRIORITY (10) – максимальный приоритет
class MyThread extends Thread {
public MyThread(String name, int priority) {
super(name);
setPriority(priority);
}

@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName() + " выполняется с приоритетом " + getPriority());
}
}
}

public class Main {
public static void main(String[] args) {
MyThread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);
MyThread high = new MyThread("High Priority", Thread.MAX_PRIORITY);

low.start();
high.start();
}
}


🟠Почему `setPriority()` не даёт 100% контроль?
Приоритет – это всего лишь рекомендация для ОС.
Распределение процессорного времени зависит от планировщика ОС.
В Windows, Linux, macOS приоритеты работают по-разному, и Java не контролирует их на низком уровне.

🟠Как действительно заставить поток выполниться первым?
Реальные способы управления порядком выполнения:
а) Использование join()
Позволяет дождаться выполнения одного потока перед запуском другого.
public class Main {
public static void main(String[] args) throws InterruptedException {
Thread high = new MyThread("High Priority", Thread.MAX_PRIORITY);
Thread low = new MyThread("Low Priority", Thread.MIN_PRIORITY);

high.start();
high.join(); // Ждём, пока high завершится

low.start(); // Теперь запускается low
}
}


б) Использование Executors.newSingleThreadExecutor()
Позволяет гарантированно выполнять потоки по очереди.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
public static void main(String[] args) {
ExecutorService executor = Executors.newSingleThreadExecutor();

executor.submit(() -> System.out.println("Задача 1"));
executor.submit(() -> System.out.println("Задача 2"));

executor.shutdown();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Как можно сделать синхронизацию?

Способы:
- ключевое слово synchronized;
- Lock из java.util.concurrent.locks;
- потокобезопасные коллекции (ConcurrentHashMap, CopyOnWriteArrayList);
- атомарные переменные (AtomicInteger, AtomicReference).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Опиши разницу типов данных DATETIME и TIMESTAMP?

В MySQL (и других реляционных БД) типы данных DATETIME и TIMESTAMP используются для хранения даты и времени, но у них есть несколько ключевых отличий.

🚩Когда использовать `DATETIME` и `TIMESTAMP`?

Используйте DATETIME, если:
Нужно хранить фиксированное значение даты и времени, не зависящее от часового пояса.
Работаете с датами за пределами 1970-2038 гг.
Требуется удобочитаемый формат (без конверсий).
Используйте TIMESTAMP, если:
Нужно учитывать часовой пояс (например, хранить время в UTC, а при запросе автоматически конвертировать в локальное).
Важно автоматическое обновление при изменении строки (ON UPDATE CURRENT_TIMESTAMP).
Нужно экономить память (занимает в 2 раза меньше места, чем DATETIME).

🚩Примеры

DATETIME (Фиксированная дата и время)
CREATE TABLE events (
id INT PRIMARY KEY,
event_time DATETIME NOT NULL
);

INSERT INTO events VALUES (1, '2025-02-17 12:30:00');


TIMESTAMP (Автообновление + Часовые пояса)
CREATE TABLE logs (
id INT PRIMARY KEY,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);


Если изменим time_zone, TIMESTAMP отобразится в новом часовом поясе.
SET time_zone = 'Europe/Moscow';
SELECT created_at FROM logs;


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Что такое «система управления базами данных»?

Система управления базами данных (СУБД) — это программное обеспечение, которое позволяет создавать, управлять и получать доступ к базам данных, обеспечивая целостность данных, безопасность, поддержку транзакций и многопользовательский доступ.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🤔 Как остановить поток?

Остановить поток в 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(); // Прерывание потока
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
🤔 Каким образом HashMap связан с Set'ом?

В Java, `HashMap` используется внутри некоторых реализаций `Set`, например, в `HashSet`. `HashSet` использует `HashMap` для хранения элементов, где каждый ключ в `HashMap` является элементом `Set`, а значение — постоянный объект, представляющий наличие ключа. Это позволяет `HashSet` эффективно реализовывать операции добавления, удаления и проверки наличия элемента.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥2🤔2
🤔 Что такое Commit в SQL?

COMMIT – это команда в SQL, которая фиксирует (сохраняет) изменения, сделанные внутри транзакции. После выполнения COMMIT изменения становятся постоянными и их уже нельзя отменить.

Простой пример использования COMMIT
BEGIN TRANSACTION;

UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

COMMIT; -- Сохраняем изменения


Что будет, если НЕ выполнить COMMIT?
BEGIN TRANSACTION;

UPDATE users SET age = 30 WHERE id = 1;


COMMIT vs ROLLBACK
BEGIN TRANSACTION;

UPDATE orders SET status = 'CANCELLED' WHERE id = 10;

ROLLBACK; -- ОТМЕНЯЕМ изменения, данные не меняются


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
🤔 Может ли Entity-класс быть абстрактным?

Да, Entity может быть абстрактным, если он служит базой для наследников. Он не будет напрямую мапиться в таблицу, но может содержать общие поля и логику.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥7
🤔 Какие знаешь методы чтения XML, опиши сильные и слабые стороны каждого метода?

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

🚩С использованием DOM (Document Object Model)

XML-файл загружается целиком в память в виде древовидной структуры. Разработчик может работать с узлами (nodes), элементами (elements) и атрибутами (attributes) через API.
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class DomExample {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("example.xml");

NodeList nodeList = doc.getElementsByTagName("element");
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
System.out.println(element.getTextContent());
}
}
}


🚩С использованием SAX (Simple API for XML)

XML обрабатывается построчно (по событиям). При чтении вызываются методы обработчика событий (например, начало элемента, конец элемента).
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class SaxExample {
public static void main(String[] args) throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse("example.xml", new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) {
System.out.println("Start Element: " + qName);
}

public void characters(char[] ch, int start, int length) {
System.out.println("Text: " + new String(ch, start, length));
}

public void endElement(String uri, String localName, String qName) {
System.out.println("End Element: " + qName);
}
});
}
}


🚩С использованием StAX (Streaming API for XML)

XML обрабатывается как поток, но предоставляет больше контроля, чем SAX. Поддерживает чтение и запись.
import javax.xml.stream.*;
import java.io.FileReader;

public class StaxExample {
public static void main(String[] args) throws Exception {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader reader = factory.createXMLStreamReader(new FileReader("example.xml"));

while (reader.hasNext()) {
int event = reader.next();
if (event == XMLStreamReader.START_ELEMENT) {
System.out.println("Start Element: " + reader.getLocalName());
} else if (event == XMLStreamReader.CHARACTERS) {
System.out.println("Text: " + reader.getText().trim());
} else if (event == XMLStreamReader.END_ELEMENT) {
System.out.println("End Element: " + reader.getLocalName());
}
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊2
🤔 Преимущества реализации ExecutorService?

- Управление пулом потоков.
- Повторное использование потоков (вместо создания новых).
- Возможность работы с Runnable, Callable, Future.
- Позволяет гибко управлять выполнением задач (отложенный запуск, цикличный и т.д.).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Слышал ли что то про цикл ForEach?

Цикл forEach – это удобный способ перебора элементов коллекций в Java.

🚩Что такое `forEach`?

Это специальный цикл, который упрощает перебор элементов коллекций и массивов. Он пришёл на замену классическому for и while, делая код чище.
List<String> names = List.of("Alice", "Bob", "Charlie");

for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i));
}


Современный forEach
for (String name : names) {
System.out.println(name);
}


🚩`forEach` как метод (Java 8+)

С выходом Java 8 в интерфейсе Iterable появился метод forEach(), который принимает лямбда-выражение.
List<String> names = List.of("Alice", "Bob", "Charlie");

names.forEach(name -> System.out.println(name));


Или с ссылкой на метод (::)
names.forEach(System.out::println);


🚩Как работает `forEach()` с Map?

Метод forEach() можно применять и к Map, передавая BiConsumer<K, V>.
Map<Integer, String> users = Map.of(1, "Alice", 2, "Bob");

users.forEach((id, name) -> System.out.println(id + " -> " + name));


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
🤔 Когда стоит изменять значение поля serialVersionUID?

- Когда структура класса меняется так, что объекты, сериализованные старой версией, несовместимы с новой;
- Например, удаление, переименование или изменение типа полей.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 Что нужно, чтобы написанная на Java программа, заработала?

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

🚩Шаги

1⃣Написание кода
Напишите Java-код в текстовом редакторе или интегрированной среде разработки (IDE), такой как IntelliJ IDEA, Eclipse или NetBeans.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}


2⃣Установка Java Development Kit (JDK)
Убедитесь, что на вашем компьютере установлен JDK (Java Development Kit). JDK включает в себя компилятор (javac) и виртуальную машину Java (JVM). Скачайте и установите последнюю версию JDK с сайта Oracle или OpenJDK.

3⃣Компиляция кода
Компилируйте Java-код в байт-код, который будет выполняться на JVM. Для этого используйте команду javac. После компиляции появится файл HelloWorld.class, содержащий байт-код.
javac HelloWorld.java


4⃣Запуск программы
Запустите скомпилированный байт-код с помощью виртуальной машины Java (JVM), используя команду java.
java HelloWorld


Вывод должен быть:
Hello, World!


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7💊3
🤔 В чём идея java.util.concurrent?

Этот пакет содержит:
- Потокобезопасные коллекции (ConcurrentHashMap, CopyOnWriteArrayList);
- Синхронизацию (Lock, Semaphore, CountDownLatch);
- Инструменты для распараллеливания и отложенного выполнения (ExecutorService, Future, Callable).
Цель — дать высокоуровневые средства для безопасной работы с многопоточностью.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12