Java | Вопросы собесов – Telegram
Java | Вопросы собесов
11.4K subscribers
31 photos
2 videos
1.13K links
Download Telegram
🤔 Есть ли смысл определять для сервлета конструктор, каким образом лучше инициализировать данные?

Определять конструктор для сервлета не рекомендуется, потому что создание экземпляров управляется контейнером. Лучше использовать метод init() для инициализации данных.


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

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

Интерфейс List в Java представляет упорядоченную коллекцию, в которой:
- допускаются дубликаты;
- можно обращаться к элементам по индексу;
- порядок вставки сохраняется.
Он предоставляет методы для работы с индексами (get, add, remove, set) и расширяет Collection.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥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
👍12
🤔 Что такое денормализация баз данных?

Денормализация — это сознательное дублирование данных или объединение таблиц, чтобы:
- снизить количество JOIN'ов;
- ускорить чтение данных;
- упростить отчёты или агрегации.
Используется, когда производительность важнее избыточности. Пример: хранить имя пользователя рядом с заказом, а не связывать с таблицей пользователей.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🤔 Какие Fetching Types знаешь в Hibernate и чем они отличаются?

В Hibernate существует два типа загрузки (Fetching Types) данных:
Lazy (ленивая загрузка)
Eager (жадная загрузка)
Эти типы определяют, как Hibernate загружает связанные сущности при выполнении запроса.

🚩Lazy Fetching (ленивая загрузка)

Данные загружаются только при первом обращении к ним.
Экономит память и ресурсы, так как ненужные данные не загружаются сразу.
Используется по умолчанию в @OneToMany, @ManyToMany.
@Entity
class User {
@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
private List<Order> orders; // Загрузятся ТОЛЬКО при первом вызове getOrders()
}

User user = session.get(User.class, 1L);  // Загружается только User
List<Order> orders = user.getOrders(); // Запрос в БД выполняется ТОЛЬКО здесь


🚩Eager Fetching (жадная загрузка)

Hibernate загружает все связанные данные сразу, даже если они не нужны.
Увеличивает время выполнения запроса, так как делает JOIN или несколько отдельных запросов.
Используется по умолчанию в @ManyToOne, @OneToOne.
@Entity
class User {
@Id @GeneratedValue
private Long id;

private String name;

@OneToMany(mappedBy = "user", fetch = FetchType.EAGER)
private List<Order> orders; // Загружается сразу при получении User
}

User user = session.get(User.class, 1L);  // Загружается User + сразу все его Orders


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

JVM можно расширить различными инструментами:
- JVisualVM или JProfiler для мониторинга производительности и анализа работы JVM.
- Heap Dump Analysis Tools для анализа состояния памяти при утечках.
- New Relic, Dynatrace для интеграции APM (Application Performance Monitoring).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15
🤔 Для чего нужен функциональный интерфейс BiConsumer<T,U>?

BiConsumer<T, U> — это функциональный интерфейс из пакета java.util.function, который принимает два входных аргумента и не возвращает результат.

Сигнатура BiConsumer<T, U>
@FunctionalInterface
public interface BiConsumer<T, U> {
void accept(T t, U u);
}


🚩Вывод пар значений

Допустим, у нас есть Map<String, Integer>, и мы хотим вывести все ключи и значения:
import java.util.Map;
import java.util.function.BiConsumer;

public class BiConsumerExample {
public static void main(String[] args) {
Map<String, Integer> map = Map.of("Alice", 30, "Bob", 25, "Charlie", 35);

// Используем BiConsumer для вывода ключа и значения
BiConsumer<String, Integer> printEntry = (key, value) ->
System.out.println("Имя: " + key + ", возраст: " + value);

// Применяем BiConsumer к каждому элементу Map
map.forEach(printEntry);
}
}


Вывод
Имя: Alice, возраст: 30  
Имя: Bob, возраст: 25
Имя: Charlie, возраст: 35


🚩Использование `BiConsumer` в `Stream`

Допустим, у нас есть список продуктов и их цены. Мы хотим увеличить цену каждого товара и напечатать результат.
import java.util.*;
import java.util.function.BiConsumer;

public class BiConsumerStreamExample {
public static void main(String[] args) {
Map<String, Double> products = new HashMap<>();
products.put("Хлеб", 50.0);
products.put("Молоко", 80.0);
products.put("Яблоки", 120.0);

// BiConsumer, который увеличивает цену и выводит её
BiConsumer<String, Double> increaseAndPrint = (name, price) -> {
double newPrice = price * 1.1; // +10%
System.out.println(name + " теперь стоит " + newPrice);
};

products.forEach(increaseAndPrint);
}
}


Вывод
Хлеб теперь стоит 55.0  
Молоко теперь стоит 88.0
Яблоки теперь стоят 132.0


🚩Объединение `BiConsumer` с `andThen()`

Метод andThen(BiConsumer<T, U>) позволяет объединять несколько действий в цепочку.
import java.util.function.BiConsumer;

public class BiConsumerChaining {
public static void main(String[] args) {
BiConsumer<String, Integer> printUser = (name, age) ->
System.out.println("Пользователь: " + name + ", возраст: " + age);

BiConsumer<String, Integer> checkAdult = (name, age) ->
System.out.println(name + (age >= 18 ? " совершеннолетний" : " несовершеннолетний"));

// Объединяем два BiConsumer'а
BiConsumer<String, Integer> combined = printUser.andThen(checkAdult);

combined.accept("Алексей", 20);
combined.accept("Мария", 16);
}
}


Вывод:
Пользователь: Алексей, возраст: 20  
Алексей совершеннолетний
Пользователь: Мария, возраст: 16
Мария несовершеннолетний


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15💊1
🤔 Можно ли переопределить метод и конструктор?

- Методы можно переопределять в дочерних классах, если они не final, не static и не private.
- Конструкторы нельзя переопределить, но можно перегрузить, создавая несколько вариантов с разными параметрами.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3
🤔 Расскажи об этапах (фазах) жизненного цикла JSP.?

🟠Перевод (Translation)
JSP страница переводится в сервлетный Java-код. JSP контейнер анализирует содержимое JSP страницы и создает соответствующий сервлетный исходный код (.java файл).

🟠Компиляция (Compilation)
Сервлетный исходный код компилируется в байт-код, создавая .class файл (сервлет). Этот этап аналогичен компиляции обычного Java-кода.

🟠Загрузка (Loading)
Скомпилированный класс сервлета загружается в память. Контейнер загружает класс сервлета, чтобы он мог быть выполнен.

🟠Инициализация (Initialization)
Контейнер вызывает метод jspInit(). Этот метод вызывается один раз при первом создании сервлета или при перезапуске сервера и предназначен для выполнения инициализационных задач (например, настройка ресурсов).

🟠Обработка запросов (Request Processing)
Для каждого HTTP-запроса вызывается метод jspService(). Этот метод обрабатывает входящий запрос и генерирует соответствующий ответ. Основная работа по генерации динамического содержимого происходит на этом этапе.

🟠Завершение (Destruction)
Когда JSP страница выводится из эксплуатации (например, при остановке сервера), контейнер вызывает метод jspDestroy(). Этот метод используется для освобождения ресурсов (например, закрытие соединений с базой данных).

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

Mutual exclusion (взаимное исключение) — это механизм, который обеспечивает, что в критический участок кода в один момент времени может зайти только один поток, предотвращая состояния гонки.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👍6
🤔 Опиши разницу типов данных 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
👍14🔥3
🤔 Какие подклассы класса OutputStream есть, для чего они предназначены?

- FileOutputStream — запись байтов в файл;
- BufferedOutputStream — буферизированная запись для ускорения;
- DataOutputStream — запись примитивных типов данных;
- ObjectOutputStream — сериализация объектов.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10
🤔 Роль `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 при десериализации.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🤔 Что подразумевается под Классом-обёрткой (Class Wrapper)?

Класс-обёртка (Wrapper class) — это объектная оболочка для примитивного типа.
В Java каждый примитив имеет соответствующий класс-обёртку:
- int → Integer
- double → Double
- char → Character
- и т.д.
Зачем нужен:
- для использования примитивов там, где требуется объект (например, в коллекциях);
- поддержка null значений;
- работа с generic-кодом (List<Integer>).


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1🤔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
...


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
🎉Разыгрываем пожизненный доступ к AI-ассистенту для поиска работы для 3 подписчиков

До запуска Софи остается меньше месяца, поэтому мы решили порадовать вас и устроить конкурс, приуроченный к этому событию.

Кто такая Софи?
Это первый в России ассистент по поиску работы, который будет сам делать отклики, писать сопроводительные письма, поможет с резюме и подготовкой к собесу, а еще избавит тебя от отказов.

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

Мы посчитали, стоимость одной такой подписки ну хотя бы на 10 лет составляла бы 420.000 руб.

Условия конкурса простые:


1. Подписаться на 4 наших канала:
Софи и партнёры
Young & Junior - вакансии IT
Young Стажёр - стажировки ИТ
IT мероприятия для стажеров и студентов
2. Нажать кнопку "участвую" под этим постом.

15 июля, в 19:00, мы в прямом эфире проведем запуск Софи, а в 20:00 опубликуем результаты конкурса в канале Софи и Партнёры.

Каждый победитель получит бесплатный доступ к Софи навсегда.

Всем удачи и до встречи в прямом эфире🚀
💊2
🤔 Какое свойство задает цвет фона?

Свойство background-color в CSS задаёт цвет фона элемента.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊47🤔6👍4🔥1
🤔 Для чего нужны функциональные интерфейсы ObjDoubleConsumer<T>, ObjIntConsumer<T> и ObjLongConsumer<T>?

Эти интерфейсы предназначены для выполнения операций над объектом и примитивным значением (double, int, long) без возврата результата.

🚩`ObjDoubleConsumer<T>` – принимает объект + `double`
Используется, когда надо обработать объект + double, но ничего не возвращать.
import java.util.function.ObjDoubleConsumer;

class User {
String name;
double discount;

User(String name) {
this.name = name;
}

void setDiscount(double discount) {
this.discount = discount;
}
}

public class Main {
public static void main(String[] args) {
ObjDoubleConsumer<User> applyDiscount = (user, discount) -> user.setDiscount(discount);

User user = new User("Иван");
applyDiscount.accept(user, 10.5); // Применяем скидку

System.out.println(user.name + " получил скидку " + user.discount + "%");
// Иван получил скидку 10.5%
}
}


🚩`ObjIntConsumer<T>` – принимает объект + `int`

Используется, когда нужно обработать объект и int, но без возврата результата.
import java.util.function.ObjIntConsumer;

class Person {
String name;
int age;

Person(String name) {
this.name = name;
}

void setAge(int age) {
this.age = age;
}
}

public class Main {
public static void main(String[] args) {
ObjIntConsumer<Person> setPersonAge = (person, age) -> person.setAge(age);

Person person = new Person("Анна");
setPersonAge.accept(person, 30); // Устанавливаем возраст

System.out.println(person.name + " теперь " + person.age + " лет");
// Анна теперь 30 лет
}
}


🚩`ObjLongConsumer<T>` – принимает объект + `long`

Используется, когда нужно передать объект + long (например, ID, время) без возврата.
import java.util.function.ObjLongConsumer;

class Account {
String username;
long id;

Account(String username) {
this.username = username;
}

void setId(long id) {
this.id = id;
}
}

public class Main {
public static void main(String[] args) {
ObjLongConsumer<Account> setAccountId = (account, id) -> account.setId(id);

Account account = new Account("user123");
setAccountId.accept(account, 100000L); // Присваиваем ID

System.out.println("Аккаунт " + account.username + " имеет ID " + account.id);
// Аккаунт user123 имеет ID 100000
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8💊3🔥1
🤔 В чём проявляется изоляция или её отсутствие?

Изоляция — это когда операции одного процесса не влияют на параллельные процессы. Её отсутствие может приводить к конфликтам при одновременном доступе к данным, неконсистентности и гонкам данных.


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

Метод intern() в классе String используется для оптимизации памяти.
Он добавляет строку в String Pool и возвращает её ссылку, если строка уже там есть.

🚩Как работает `intern()`?

Без intern() – строки создаются в Heap (куче)
String s1 = new String("Hello"); // В куче (Heap)
String s2 = new String("Hello");

System.out.println(s1 == s2); // false (разные объекты)


С intern() – строки хранятся в String Pool
String s1 = new String("Hello").intern();
String s2 = new String("Hello").intern();

System.out.println(s1 == s2); // true (одна строка в String Pool)


🚩Что такое `String Pool`?

Это специальная область памяти, где хранятся уникальные строковые литералы.
Все строковые литералы ("Hello") по умолчанию хранятся в String Pool.
String s1 = "Hello"; // В String Pool
String s2 = "Hello"; // Ссылается на тот же объект

System.out.println(s1 == s2); // true


🚩Когда использовать `intern()`?

Когда у вас много одинаковых строк в памяти (например, имена, идентификаторы).
Для экономии памяти, если строки часто дублируются.
В парсинге JSON, XML – одни и те же строки могут повторяться тысячи раз.
List<String> names = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
names.add(("User" + (i % 100)).intern()); // Используем String Pool
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10