Java | Вопросы собесов
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv
Show more📈 Analytical overview of Telegram channel Java | Вопросы собесов
Channel Java | Вопросы собесов (@easy_java_ru) in the Russian language segment is an active participant. Currently, the community unites 11 395 subscribers, ranking 10 557 in the Technologies & Applications category and 56 180 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 11 395 subscribers.
According to the latest data from 27 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -5 over the last 30 days and by -3 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 9.06%. Within the first 24 hours after publication, content typically collects 5.90% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 033 views. Within the first day, a publication typically gains 672 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 3.
- Thematic interests: Content is focused on key topics such as ставь, void, string, строка, static.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy
Контакт для рекламы: @easyoffer_adv”
Thanks to the high frequency of updates (latest data received on 28 August, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
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).
🚩Когда нужно переопределять методы?
Когда подкласс должен изменить поведение родительского класса.
Когда работаем с абстрактными классами и интерфейсами.
Когда используем полиморфизм для гибкости кода.
Ставь 👍 и забирай 📚 Базу знаний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 (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний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 более удобен для запросов с параметрами.
Ставь 👍 и забирай 📚 Базу знаний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(); // Прерывание потока
}
}
Ставь 👍 и забирай 📚 Базу знанийclass Example {
void print(String text) {} // Сигнатура: print(String)
void print(int number) {} // Сигнатура: print(int)
int print(String text, int number) { return 0; } // Сигнатура: print(String, int)
}
🚩Почему сигнатура важна?
🟠Перегрузка методов (Method Overloading)
В одном классе можно создавать методы с одинаковыми именами, но разными сигнатурами.
class MathUtils {
int sum(int a, int b) { return a + b; } // sum(int, int)
double sum(double a, double b) { return a + b; } // sum(double, double)
}
🟠Переопределение методов (Method Overriding)
При переопределении метода (в наследовании) сигнатура ДОЛЖНА быть такой же.
class Parent {
void show() {} // Сигнатура: show()
}
class Child extends Parent {
@Override
void show() {} // ✅ Сигнатура совпадает, корректное переопределение
}
🚩Ошибки, связанные с сигнатурой
Ошибка: Возвращаемый тип НЕ влияет на сигнатуру
class Test {
int method(int x) { return x; }
double method(int x) { return x; } // Ошибка! Сигнатура совпадает
}
Ставь 👍 и забирай 📚 Базу знанийexample.com/index.html:
Браузер отправляет HTTP-запрос:
GET /index.html HTTP/1.1 Host: example.comВеб-сервер (например, Nginx) получает запрос и отправляет браузеру файл
index.html.
Web Server НЕ обрабатывает логику приложения, он просто отправляет файлы клиенту.
🚩Application Server (сервер приложений)
Обрабатывает динамические запросы (например, авторизацию, платежи, работу с БД).
Выполняет Java-код (Servlet, EJB, Spring, Hibernate).
Может генерировать HTML-страницы на сервере (JSP, Thymeleaf).
Управляет транзакциями и соединениями с базой данных.
Tomcat (самый популярный в мире Java-сервер)
WildFly (JBoss)
GlassFish
WebLogic, WebSphere
Допустим, пользователь заходит на example.com/login:
Браузер отправляет HTTP-запрос:
POST /login HTTP/1.1 Host: example.comСтавь 👍 и забирай 📚 Базу знаний
@Test
public void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}
🟠Интеграционное тестирование (Integration Testing)
Тестирование взаимодействия между модулями.
Цель: Убедиться, что модули правильно работают вместе.
Пример: Проверка взаимодействия сервиса и базы данных.
Инструменты: Spring Test, Apache Camel Test.
🟠Системное тестирование (System Testing)
Проверка всей системы как единого целого.
Цель: Убедиться, что все компоненты работают вместе и система соответствует требованиям.
🟠Приемочное тестирование (Acceptance Testing)
Проводится с участием клиента или конечных пользователей.
Цель: Убедиться, что система удовлетворяет бизнес-требованиям.
🚩По методам выполнения
🟠Ручное тестирование (Manual Testing)
Тесты выполняются вручную.
Цель: Найти ошибки, которые может не уловить автоматизация.
Пример: Тестировщик вручную проверяет пользовательский интерфейс.
🟠Автоматизированное тестирование (Automated Testing)
Тесты выполняются автоматически с использованием скриптов и инструментов.
Цель: Снизить время и затраты на повторяющиеся тесты.
Инструменты: Selenium, JUnit, Appium.
🚩По целям тестирования
🟠Функциональное тестирование
Проверяет, что функции системы работают как ожидалось.
Цель: Убедиться в соответствии требованиям.
Инструменты: Selenium, Postman.
🟠Нефункциональное тестирование
Тестирование производительности (Performance Testing): Проверяет скорость, отклик и стабильность.
Инструменты: JMeter, Gatling.
Тестирование безопасности (Security Testing): Проверяет защиту системы.
Инструменты: OWASP ZAP, Burp Suite.
Тестирование удобства использования (Usability Testing): Проверяет интерфейс на удобство для пользователя.
🚩По типам тестирования
🟠Smoke Testing
Быстрая проверка работоспособности ключевых функций.
Цель: Убедиться, что основные функции работают, прежде чем углубляться в тесты.
🟠Регрессионное тестирование
Проверяет, что новые изменения не сломали старую функциональность.
Цель: Убедиться, что баги, исправленные ранее, не повторились.
🟠Тестирование черного ящика (Black Box Testing)
Проверяет систему без знаний о внутреннем устройстве.
Цель: Оценить функциональность с точки зрения пользователя.
🟠Тестирование белого ящика (White Box Testing)
Проверяет систему с учетом внутренней структуры кода.
Цель: Оценить корректность логики программы.
🚩Специальные виды тестирования
🟠A/B тестирование
Проверяет, какая версия системы лучше (например, два варианта интерфейса).
Цель: Повысить пользовательский опыт.
🟠Тестирование нагрузки (Load Testing)
Проверяет, как система работает под большой нагрузкой.
Инструменты: Apache JMeter.
🟠Тестирование на отказоустойчивость (Stress Testing)
Проверяет, как система работает в условиях сверхвысокой нагрузки.
Ставь 👍 и забирай 📚 Базу знанийclass Car {
void drive() {
System.out.println("Машина едет...");
}
}
public class Main {
public static void main(String[] args) {
Car car = new Car(); // Создаём объект вручную
car.drive();
}
}
🟠Spring Bean (управляемый объект)
Spring создаёт и управляет бином через аннотации.
import org.springframework.stereotype.Component;
@Component // Сообщает Spring, что этот класс - Bean
class Car {
void drive() {
System.out.println("Spring-машина едет...");
}
}
Теперь объект создаётся 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); // Получаем Bean из Spring-контейнера
car.drive();
}
}
Ставь 👍 и забирай 📚 Базу знанийequals() в Java предназначен для проверки равенства двух объектов. Если объект, переданный в метод equals(), равен null, метод должен возвращать `false`, так как объект не может быть равен null по определению. Рассмотрим этот случай более подробно.
🚩Почему важно обрабатывать `null` в `equals()`?
🟠Контракт метода `equals()`
Согласно спецификации Java, метод equals() должен возвращать false, если объект, переданный в метод, равен null. Это необходимо для корректного сравнения объектов.
Симметричность: Если a.equals(b) возвращает true, то b.equals(a) также должно возвращать true.
Для null: Вызов x.equals(null) всегда должен возвращать false.
🟠Предотвращение `NullPointerException`
Если метод equals() не проверяет, является ли объект null, попытка доступа к его полям или методам вызовет NullPointerException.
🚩Как правильно реализовать метод `equals()`?
Вот стандартный способ реализации метода equals()
@Override
public boolean equals(Object obj) {
// Проверяем, равен ли объект null
if (obj == null) {
return false;
}
// Проверяем, является ли объект тем же самым
if (this == obj) {
return true;
}
// Проверяем, принадлежит ли объект тому же классу
if (getClass() != obj.getClass()) {
return false;
}
// Приводим объект к текущему типу
MyClass other = (MyClass) obj;
// Сравниваем необходимые поля
return this.field.equals(other.field);
}
🚩Что происходит, если игнорировать проверку `null`?
Если вы не проверяете null, код вроде следующего приведет к ошибке
MyClass obj1 = new MyClass("Hello");
MyClass obj2 = null;
System.out.println(obj1.equals(obj2)); // Если нет проверки null -> NullPointerException
Пример с проверкой null
class MyClass {
private String value;
public MyClass(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (this == obj) {
return true;
}
if (getClass() != obj.getClass()) {
return false;
}
MyClass other = (MyClass) obj;
return value.equals(other.value);
}
}
public class Main {
public static void main(String[] args) {
MyClass obj1 = new MyClass("Hello");
MyClass obj2 = null;
System.out.println(obj1.equals(obj2)); // false
}
}
Ставь 👍 и забирай 📚 Базу знаний