Java | Вопросы собесов
11.5K subscribers
33 photos
2 videos
1.27K links
Download Telegram
🤔 В чем разница между 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 более удобен для запросов с параметрами.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
🤔 В чем отличия GenericServlet и HttpServlet?

1. GenericServlet: общий класс для всех сервлетов, не зависящих от HTTP-протокола.
2. HttpServlet: специализированный класс для работы с HTTP-протоколом, предоставляющий методы для обработки GET, POST, PUT и других запросов.
3. GenericServlet подходит для общих задач, а HttpServlet оптимизирован для веб-приложений.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤔 Какая коллекция реализует дисциплину обслуживания 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 (очередь пуста)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🤔2
🤔 Что такое неблокирующие алгоритмы?

Это алгоритмы, которые не используют блокировки (synchronized/lock) для синхронизации.
Они используют:
- атомарные операции (compareAndSet, Atomic*);
- структуры CAS;
- обеспечивают высокую производительность в многопоточности, избегая дедлоков.


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

Переопределение методов (Method Overriding) относится к полиморфизму – одному из ключевых принципов ООП.

🚩Как работает переопределение (`@Override`)?

Переопределение (Overriding) – это когда подкласс изменяет поведение метода родительского класса.
class Animal {
void makeSound() {
System.out.println("Какое-то животное издаёт звук");
}
}

class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Гав-гав!");
}
}

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


Используем полиморфизм
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // Полиморфизм
myAnimal.makeSound(); // Выведет "Гав-гав!"
}
}



🚩Переопределение = полиморфизм времени выполнения (Runtime Polymorphism)

Перегрузка (Overloading) – полиморфизм времени компиляции (Compile-time).
Переопределение (Overriding) – полиморфизм времени выполнения (Runtime).

🚩Когда нужно переопределять методы?

Когда подкласс должен изменить поведение родительского класса.
Когда работаем с абстрактными классами и интерфейсами.
Когда используем полиморфизм для гибкости кода.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Что такое партишн?

Разделение данных или таблицы на части (по строкам или столбцам) для масштабируемости и ускорения доступа. Часто используется в БД, Kafka, Hadoop.

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

Использование строк в качестве ключей в HashMap очень распространено, потому что строки обладают рядом свойств, которые идеально подходят для этой задачи. Вот основные причины:

🟠Строки неизменяемы
Что это значит: После создания строка не может быть изменена (все операции над строками создают новый объект).
Почему это важно: Ключ в HashMap должен быть неизменяемым, потому что, если ключ изменится после его добавления, это нарушит работу хэш-таблицы. Например, HashMap больше не сможет найти объект по этому ключу.

  HashMap<String, Integer> map = new HashMap<>();
String key = "hello";
map.put(key, 1);
// key остается "hello", ничего не ломается


🟠Эффективный `hashCode` и `equals`
Что это значит: Класс String в Java имеет качественно реализованные методы hashCode() и equals(), которые оптимизированы для работы с большими наборами данных.
Почему это важно: Эти методы определяют, куда ключ попадет в HashMap (по хэш-коду) и сравнивают ключи (по equals), чтобы избежать коллизий.
Особенность: Алгоритм hashCode() у строки быстро вычисляет хэш-код на основе её символов.

  String str1 = "hello";
String str2 = "hello";
System.out.println(str1.hashCode() == str2.hashCode()); // true


🟠Простота использования
Что это значит: Строки легко создавать, читать и понимать. Они часто используются для идентификаторов (например, имён, адресов, кодов).
Почему это важно: Программистам удобно использовать строки в качестве ключей, потому что их легко интерпретировать.

🟠Универсальность
Что это значит* Строки могут представлять самые разные данные — от имён и кодов до сложных текстовых идентификаторов.
Почему это важно: Почти любой объект или данные можно однозначно представить в виде строки, что делает её универсальным кандидатом на роль ключа.

🟠Широкая поддержка
Что это значит: Почти все приложения и API Java оперируют строками.
Почему это важно: Это упрощает интеграцию строк как ключей в сложных системах.

🚩Пример использования строки в качестве ключа

import java.util.HashMap;

public class Main {
public static void main(String[] args) {
HashMap<String, Integer> ageMap = new HashMap<>();
ageMap.put("Alice", 30);
ageMap.put("Bob", 25);
ageMap.put("Charlie", 35);

// Получаем значение по строковому ключу
System.out.println("Возраст Боба: " + ageMap.get("Bob")); // 25
}
}


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

- Описывает структуру веб-страницы;
- Состоит из тегов и вложенных элементов;
- Поддерживает атрибуты, ссылки, формы, таблицы, скрипты;
- Не содержит логики — только разметка.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊8👍6🤔2
🤔 Назови основные свойства транзакции

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

🚩Атомарность (Atomicity) — "всё или ничего"
Транзакция выполняется полностью или не выполняется вовсе.
Перевод 1000 рублей с одного счёта на другой:
- Списать 1000 рублей с А
- Зачислить 1000 рублей на B
Если вторая операция не удалась, первая должна быть отменена.
try {
connection.setAutoCommit(false); // Отключаем автокоммит
withdraw(accountA, 1000);
deposit(accountB, 1000);
connection.commit(); // Подтверждаем транзакцию
} catch (Exception e) {
connection.rollback(); // Откат в случае ошибки
}


🚩Согласованность (Consistency) — "данные остаются корректными"

После транзакции данные должны оставаться в логически правильном состоянии.

🚩Изолированность (Isolation) — "отдельно от других транзакций"

Одна транзакция не должна мешать выполнению другой.
Два клиента одновременно бронируют одно и то же место в самолёте.
Система должна обработать их по очереди, а не одновременно.
В Java изолированность регулируется уровнями транзакций (TRANSACTION_READ_COMMITTED, TRANSACTION_REPEATABLE_READ и т. д.), чтобы избежать проблем, таких как "грязное чтение" или "фантомные записи".
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);


🚩Долговечность (Durability) — "данные не теряются"

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

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

За наследование отвечают:
- ключевое слово extends — для классов;
- ключевое слово implements — для интерфейсов;
- super — доступ к родительским членам;
-
@Override — пометка переопределения.

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

Это процесс отладки (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⃣Рефакторинг и исправление
Исправьте ошибку, убедившись, что исправление не приводит к новым ошибкам. Проверьте весь код на предмет аналогичных ошибок.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
🤔 Для чего нужны Predicate<T>, DoublePredicate, IntPredicate, LongPredicate?

Для проверки условий, возвращают boolean. Применяются в фильтрации, валидации, условиях (filter, removeIf и др.).


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

Spring Bean – это ОБЪЕКТ, который управляется Spring-контейнером.

🚩Пример: Обычный класс vs. Bean

Обычный класс (НЕ Bean)
class Car {
void drive() {
System.out.println("Машина едет...");
}
}

public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создание обычного объекта вручную
car.drive();
}
}


Bean в Spring
import org.springframework.stereotype.Component;

@Component // Аннотация говорит Spring, что этот класс – Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}

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); // Получаем объект из Spring-контейнера
car.drive();
}
}


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

JVM выбрасывает специальное исключение ExceptionInInitializerError, указывающее на ошибку при инициализации класса в момент его загрузки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍4💊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
👍5
🤔 Какой жизненный цикл Maven?

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


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

Адаптер (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();
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🤔4
🤔 Какие есть отношения в БД?

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


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

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

🚩Основная структура

try {
// Код, который может выбросить исключение
} catch (Exception e) {
// Обработка исключения
} finally {
// Этот блок выполнится всегда
}


Пример
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("file.txt");
System.out.println(fileInputStream.read());
} catch (IOException e) {
System.out.println("Ошибка: " + e.getMessage());
} finally {
if (fileInputStream != null) {
fileInputStream.close(); // Всегда закрываем файл
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔5👍2💊1
🤔 Известно ли что-то про ReadLock и WriteLock?

Да, это части ReentrantReadWriteLock:
- ReadLock позволяет многим потокам читать одновременно, если никто не пишет.
- WriteLock — даёт эксклюзивный доступ для записи.
Полезно для сценариев много чтения / мало записи.


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