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

Контакт для рекламы: @easyoffer_adv
Download Telegram
🤔 Расскажи про способы оптимизации запросов в БД

Оптимизация запросов в базе данных (БД) — это процесс улучшения их производительности, чтобы они выполнялись быстрее и использовали меньше ресурсов. Рассмотрим основные способы оптимизации SQL-запросов.

🟠Индексы
Индексы ускоряют поиск данных, создавая структуру, похожую на оглавление книги. Вместо полного перебора таблицы (Full Table Scan), БД быстро находит нужные строки по индексу.
CREATE INDEX idx_user_name ON users(name);


🟠Оптимизация `SELECT`
Избегайте SELECT *, так как это нагружает систему избыточными данными.
Плохо
SELECT * FROM users;


Хорошо
SELECT id, name FROM users;


🟠Использование `EXPLAIN`
Перед оптимизацией полезно посмотреть, как БД выполняет запрос.
EXPLAIN SELECT * FROM users WHERE name = 'Ivan';


🟠Ограничение выборки (`LIMIT`, `OFFSET`)
Если вам нужно получить только первые N строк, используйте LIMIT, чтобы БД не грузила лишние данные.
SELECT * FROM users ORDER BY id LIMIT 10;


🟠Оптимизация `JOIN`
Соединение (JOIN) таблиц может быть дорогостоящим. Вот несколько рекомендаций:
- Используйте индексы на полях, участвующих в JOIN.
- Если возможно, замените сложные JOIN на подзапросы (EXISTS, IN).
CREATE INDEX idx_orders_user_id ON orders(user_id);


🟠Кеширование запросов
Часто повторяющиеся запросы можно кэшировать на уровне БД (QUERY CACHE в MySQL) или в приложении (Redis, Memcached).
SET GLOBAL query_cache_size = 1000000;


🟠Нормализация и денормализация
Нормализация уменьшает дублирование данных, разбивая таблицы.
Денормализация может ускорить работу, дублируя данные и уменьшая количество JOIN.

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

- try-catch: Перехват и обработка исключений.
- finally: Код, который выполняется независимо от того, возникло исключение или нет.
- throw: Выбрасывание исключений.
- throws: Объявление исключений в сигнатуре метода.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍5
🤔 Какие минусы 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

Ставь 👍 и забирай 📚 Базу знаний
👍7
🤔 В чём разница между String и StringBuilder?

- String:
- Неизменяемая (immutable).
- Каждое изменение создаёт новую строку.
- Удобно для чтения, но неэффективно при множественных изменениях.
- StringBuilder:
- Изменяемая (mutable).
- Эффективен при конкатенации или сборке строк в цикле.
- Не потокобезопасен, но работает быстрее.
Если нужно собрать строку в цикле — выбирай StringBuilder, а не +.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍11
🤔 Какая сложность поиска метода по ключу в коллекции 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
🤔 Какие есть методы HTTP-запросов?

- GET — получение данных;
- POST — создание ресурса;
- PUT — полное обновление ресурса;
- PATCH — частичное обновление;
- DELETE — удаление;
- HEAD, OPTIONS, TRACE — вспомогательные методы.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍8💊1
🤔 Как бороться в БД с SQL Injection?

SQL Injection – это атака, при которой злоумышленник вставляет вредоносный SQL-код в запрос, чтобы получить несанкционированный доступ к данным.

Допустим, у нас есть код
String query = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";


Если злоумышленник введёт ' OR '1'='1 в поле пароля, запрос превратится в:
SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'


🚩Способы защиты от SQL Injection

🟠Использование `PreparedStatement` (РЕКОМЕНДУЕТСЯ)
Подготовленные запросы автоматически экранируют входные данные, предотвращая SQL-инъекции.
String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();


🟠Использование ORM (например, Hibernate)
ORM-фреймворки (Hibernate, JPA) автоматически генерируют безопасные SQL-запросы.
TypedQuery<User> query = entityManager.createQuery(
"SELECT u FROM User u WHERE u.username = :username AND u.password = :password", User.class);
query.setParameter("username", username);
query.setParameter("password", password);
User user = query.getSingleResult();


🟠Проверка и экранирование входных данных
Если по какой-то причине PreparedStatement использовать нельзя, экранируйте опасные символы (', " и ;).
String safeInput = input.replace("'", "\\'");


🟠Минимизация прав в БД
Создавайте отдельного пользователя БД с ограниченными правами:
Запрет на DROP, DELETE, UPDATE без WHERE
Только доступ к нужным таблицам
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'securepassword';
GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'app_user'@'localhost';


🟠Использование Web Application Firewall (WAF)
WAF анализирует HTTP-запросы и блокирует подозрительные SQL-запросы. Пример: ModSecurity – популярный WAF для защиты веб-приложений.

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

Для подключения своей библиотеки:
- собрать её в JAR;
- опубликовать в локальный или удалённый репозиторий (например, Maven Central, Nexus, Artifactory);
- добавить зависимость в pom.xml или build.gradle другого проекта.


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

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

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

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

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

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

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

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

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

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

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

Временная сложность — это оценка времени выполнения алгоритма в зависимости от размера входных данных. Измеряется через нотацию O(...) и помогает сравнивать эффективность алгоритмов.


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