ar
Feedback
Java | Вопросы собесов

Java | Вопросы собесов

الذهاب إلى القناة على Telegram

📈 نظرة تحليلية على قناة تيليجرام Java | Вопросы собесов

تُعد قناة Java | Вопросы собесов (@easy_java_ru) في القطاع اللغوي الروسية لاعباً نشطاً. يضم المجتمع حالياً 11 392 مشتركاً، محتلاً المرتبة 10 556 في فئة التكنولوجيات والتطبيقات والمرتبة 56 214 في منطقة روسيا.

📊 مؤشرات الجمهور والحراك

منذ تأسيسه في невідомо، حقق المشروع نمواً سريعاً وجمع 11 392 مشتركاً.

بحسب آخر البيانات بتاريخ 28 أغسطس, 2026، تحافظ القناة على نشاط مستقر. خلال آخر 30 يوماً تغيّر عدد الأعضاء بمقدار -11، وفي آخر 24 ساعة بمقدار -4، مع بقاء الوصول العام مرتفعاً.

  • حالة التحقق: غير موثّقة
  • معدل التفاعل (ER): يبلغ متوسط تفاعل الجمهور 9.07‎%. وخلال أول 24 ساعة من النشر يحصد المحتوى عادةً 5.84‎% من ردود الفعل نسبةً إلى إجمالي المشتركين.
  • وصول المنشورات: يحصل كل منشور على متوسط 1 033 مشاهدة. وخلال اليوم الأول يجمع عادةً 666 مشاهدة.
  • التفاعلات والاستجابة: يتفاعل الجمهور بانتظام؛ متوسط التفاعلات لكل منشور يبلغ 3.
  • الاهتمامات الموضوعية: يركز المحتوى على مواضيع رئيسية مثل ставь, void, string, строка, static.

📝 الوصف وسياسة المحتوى

يصف المؤلف القناة بأنها مساحة للتعبير عن الآراء الذاتية:
Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

بفضل وتيرة التحديث المرتفعة (أحدث البيانات بتاريخ 29 أغسطس, 2026) تحافظ القناة على حداثتها ومستوى وصول مرتفع. وتُظهر التحليلات تفاعلاً نشطاً من الجمهور، ما يجعلها نقطة تأثير مهمة ضمن فئة التكنولوجيات والتطبيقات.

11 392
المشتركون
-424 ساعات
+27 أيام
-1130 أيام
أرشيف المشاركات
🤔 Назови основные свойства транзакции В базах данных и многопоточных системах транзакция — это атомарная последовательность операций, которая должна выполняться корректно и полностью. 🚩Атомарность (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) — "данные не теряются" После успешного завершения транзакции данные не должны теряться даже при сбоях (например, отключении электричества). Ставь 👍 и забирай 📚 Базу знаний

🤔 Что характерно для HTML? - Описывает структуру веб-страницы; - Состоит из тегов и вложенных элементов; - Поддерживает атрибуты, ссылки, формы, таблицы, скрипты; - Не содержит логики — только разметка. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Почему строки так часто используют в виде ключей в 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
    }
}
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 К какому принципу ООП относится переопределение методов? Переопределение методов (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). 🚩Когда нужно переопределять методы? Когда подкласс должен изменить поведение родительского класса. Когда работаем с абстрактными классами и интерфейсами. Когда используем полиморфизм для гибкости кода. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое неблокирующие алгоритмы? Это алгоритмы, которые не используют блокировки (synchronized/lock) для синхронизации. Они используют: - атомарные операции (compareAndSet, Atomic*); - структуры CAS; - обеспечивают высокую производительность в многопоточности, избегая дедлоков. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какая коллекция реализует дисциплину обслуживания 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 (очередь пуста)
Ставь 👍 и забирай 📚 Базу знаний

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

🤔 В чем разница между 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 более удобен для запросов с параметрами. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие промежуточные методы работы со стримами есть? - map(), flatMap() и их примитивные аналоги; - filter(); - distinct(); - sorted(); - peek() (для отладки); - limit(), skip(). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как остановить поток? Остановить поток в 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(); // Прерывание потока
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чём идея Autoboxing и Unboxing? Autoboxing — это автоматическое преобразование примитива в объект-обёртку. Unboxing — обратное преобразование объекта-обёртки в примитив. Это удобно при работе с коллекциями и дженериками. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое сигнатура? Сигнатура метода – это его уникальная идентификация в классе. Она включает: Имя метода Список параметров (их типы и порядок)
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; } // Ошибка! Сигнатура совпадает
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Как хранил данные в проектах? Использовались подходы: - Реляционные БД (PostgreSQL, MySQL) — для структурированных данных, бизнес-логики. - NoSQL (Redis, MongoDB) — для кэша, документов, логов. - Файловое хранилище (S3, диск) — для медиафайлов, бэкапов. - Room/SQLite — для хранения данных локально на Android. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем отличаются Web server и Application server? 🟠Web Server (веб-сервер) обрабатывает HTTP-запросы и отдает статический контент (HTML, CSS, JS, изображения). 🟠Application Server (сервер приложений) запускает бизнес-логику приложения, выполняет обработку данных и работает с базой данных. 🚩Web Server (веб-сервер) Принимает HTTP-запросы от браузера. Отдает статические файлы (HTML, CSS, JS, картинки). Может перенаправлять запросы к Application Server. Apache HTTP Server Nginx Microsoft IIS Допустим, пользователь открывает сайт 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
Ставь 👍 и забирай 📚 Базу знаний

Новогодняя коллекция KUSMI TEA Погрузитесь в новогоднее волшебство — путешествуйте сквозь время и страны вместе с неизменным спутником - пером Жюля Верна! Каждая страница — открытие, каждый глоток — новая страна на карте ваших ощущений. Новогодний чай и адвент-календарь от KUSMI уже в Москве! Узнать больше #реклама tea-france.com О рекламодателе

🤔 Каким образом реализованы методы hashCode() и equals() в классе Object? - equals() по умолчанию — сравнение по ссылке (один и тот же объект); - hashCode() — возвращает уникальный числовой идентификатор, который может зависеть от адреса в памяти (если не переопределён). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие виды тестов знаешь? В программировании существует множество видов тестирования, которые можно разделить на категории по уровню тестирования, методам выполнения и целям. Вот основные виды: 🚩По уровню тестирования 🟠Модульное тестирование (Unit Testing) Тестирование отдельных методов или классов. Цель: Проверить работу минимальных компонентов программы. Инструменты: JUnit, TestNG.
  @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) Проверяет, как система работает в условиях сверхвысокой нагрузки. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое внедрение зависимости? Внедрение зависимости (Dependency Injection) — это передача объекта (зависимости) другому объекту извне, а не создание его внутри. Это снижает связанность и улучшает тестируемость кода. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем отличается обычный объект от Bean? В Spring термин Bean (бин) означает объект, управляемый Spring-контейнером. 🟠Обычный объект (Java POJO) Создаётся вручную, Spring о нём ничего не знает
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();
    }
}
Ставь 👍 и забирай 📚 Базу знаний