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

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

Open in Telegram

📈 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 450 subscribers, ranking 10 899 in the Technologies & Applications category and 57 490 in the Russia region.

📊 Audience metrics and dynamics

Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 11 450 subscribers.

According to the latest data from 05 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by 20 over the last 30 days and by 6 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 7.92%. Within the first 24 hours after publication, content typically collects 7.61% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 907 views. Within the first day, a publication typically gains 871 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 0.
  • 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:
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy

Thanks to the high frequency of updates (latest data received on 06 June, 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.

11 450
Subscribers
+624 hours
-117 days
+2030 days
Posts Archive
🤔 Что такое HQL? HQL (Hibernate Query Language) – это язык запросов, используемый в Hibernate (фреймворке для работы с базами данных в Java), который похож на SQL, но оперирует не таблицами и столбцами, а объектами и их свойствами. 🚩Зачем нужен HQL? Когда мы работаем с базами данных в Hibernate, мы используем объектно-реляционное отображение (ORM), где каждая таблица представляется как класс, а строки – как объекты. Однако иногда нам нужно делать запросы к базе данных, например: Получить список объектов, соответствующих определённому критерию Отфильтровать, отсортировать или объединить данные Выполнить массовое обновление или удаление Можно, конечно, использовать чистый SQL, но тогда мы потеряем преимущества ORM, такие как переносимость кода между разными базами данных. HQL решает эту проблему, позволяя писать запросы в объектных терминах, а Hibernate сам преобразует их в правильный SQL для конкретной базы данных. 🚩Как выглядит HQL? HQL очень похож на SQL, но вместо таблиц и столбцов мы используем имена классов и их полей. 🟠Пример 1: Получение списка объектов Допустим, у нас есть класс User, связанный с таблицей users:
@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    private int age;
    
    // Геттеры и сеттеры
}
Теперь напишем HQL-запрос, чтобы получить всех пользователей старше 18 ле
String hql = "FROM User WHERE age > 18";
List<User> users = session.createQuery(hql, User.class).getResultList();
Выборка только имен пользователей
String hql = "SELECT u.name FROM User u";
List<String> names = session.createQuery(hql, String.class).getResultList();
Запрос с параметрами (предотвращает SQL-инъекции)
String hql = "FROM User WHERE name = :name";
Query<User> query = session.createQuery(hql, User.class);
query.setParameter("name", "Иван");
List<User> users = query.getResultList();
🚩ПлюсыНезависимость от СУБД HQL автоматически адаптируется под MySQL, PostgreSQL, Oracle и другие базы. ➕Оперирование объектами вместо таблиц и столбцов мы работаем с сущностями (классами Java). ➕Безопасность использование параметров (setParameter()) предотвращает SQL-инъекции. ➕Гибкость поддержка JOIN, GROUP BY, ORDER BY и других SQL-конструкций. Ставь 👍 и забирай 📚 Базу знаний

🤔 Какое основное призвание интерфейса Map? Основное назначение Map — хранение, поиск и управление данными по ключу. Это обеспечивает быстрый доступ к значениям, используя уникальные ключи, и позволяет решать задачи по работе с кэшами, индексами, словарями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

Куда срочно перенести рабочие чаты? Битрикс24 — мессенджер для работы и бизнеса. Личные и групповые чаты, видеозвонки и канал
Куда срочно перенести рабочие чаты? Битрикс24 — мессенджер для работы и бизнеса. Личные и групповые чаты, видеозвонки и каналы в одном сервисе. Приглашайте коллег и внешние команды. Работает как привычный мессенджер. Есть бесплатный тариф. Начните работать уже сейчас. Попробовать #реклама 16+ bitrix24.ru О рекламодателе

🤔 Перечисли основные агрегатные функции. - COUNT() — количество строк; - SUM() — сумма значений; - AVG() — среднее значение; - MAX() — максимум; - MIN() — минимум. Эти функции применяются к группам строк или ко всему набору данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про транзитивность Транзитивность — это математическое и логическое свойство отношений, означающее, что если A связано с B, а B связано с C, то A связано с C. 🚩Транзитивность в отношении эквивалентности (`equals`) Согласно контракту метода equals(), он должен быть транзитивным
class Person {
    String name;

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

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return name.equals(person.name);
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Иван");
        Person p2 = new Person("Иван");
        Person p3 = new Person("Иван");

        System.out.println(p1.equals(p2)); // true
        System.out.println(p2.equals(p3)); // true
        System.out.println(p1.equals(p3)); // true (транзитивность)
    }
}
🚩Транзитивность в сравнении (`compareTo` из `Comparable`) Метод compareTo() должен соблюдать транзитивность:
class Student implements Comparable<Student> {
    int age;

    Student(int age) {
        this.age = age;
    }

    @Override
    public int compareTo(Student other) {
        return Integer.compare(this.age, other.age);
    }
}

public class Main {
    public static void main(String[] args) {
        Student s1 = new Student(25);
        Student s2 = new Student(20);
        Student s3 = new Student(15);

        System.out.println(s1.compareTo(s2)); // > 0 (s1 > s2)
        System.out.println(s2.compareTo(s3)); // > 0 (s2 > s3)
        System.out.println(s1.compareTo(s3)); // > 0 (s1 > s3) (транзитивность)
    }
}
🚩Транзитивность в наследовании (`extends` / `implements`) В Java классы могут наследоваться транзитивно
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое интерфейсы Comparable? Интерфейс для естественной сортировки объектов через реализацию метода compareTo(). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про процесс от пуша кода до продакшена Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью CI/CD (Continuous Integration / Continuous Deployment). 🚩Этапы CI/CD 🟠Разработчик пушит код в Git-репозиторий - Код отправляется в GitHub, GitLab, Bitbucket или другой репозиторий. - Открывается Pull Request (PR) для ревью.
git add .
git commit -m "Добавлена новая фича"
git push origin feature-branch
🟠CI (Continuous Integration) – Автоматическая сборка и тестирование После пуша CI-сервер (Jenkins, GitHub Actions, GitLab CI/CD, CircleCI)** запускает автоматические тесты и сборку. Клонирование репозитория. Сборка проекта (например, mvn package для Java). Запуск юнит-тестов (JUnit, Mockito). Запуск интеграционных тестов (например, TestContainers). Анализ кода (SonarQube).
name: CI Pipeline

on:
  push:
    branches:
      - main
      - develop

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Setup Java
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

      - name: Build project
        run: mvn clean package

      - name: Run tests
        run: mvn test
🟠CD (Continuous Deployment) – Развёртывание на Staging После успешного CI код автоматически разворачивается в стейджинг (staging) – это тестовая среда, похожая на продакшен. Развёртывание может происходить с помощью: Docker + Kubernetes (K8s) AWS CodeDeploy, GitLab CD Terraform + Ansible
FROM openjdk:17
COPY target/app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
🟠Код проходит код-ревью и одобряется Проверяется чистота кода, читаемость и ошибки. В некоторых компаниях код проходит Security Review
git merge feature-branch
git push origin main
🟠CD (Continuous Deployment) – Развёртывание в продакшен Blue-Green Deployment – новый код разворачивается на отдельном сервере, затем трафик переключается. Canary Release – новый код деплоится на 5-10% пользователей, если всё хорошо – на всех. Rolling Deployment – обновление происходит поэтапно, без даунтайма.
deploy:
  stage: deploy
  script:
    - kubectl apply -f deployment.yaml
  only:
    - main
Ставь 👍 и забирай 📚 Базу знаний

🤔 Почему Vue? - Прост в изучении; - Подходит как для SPA, так и для встраивания в страницы; - Реактивность и декларативный шаблонный синтаксис; - Хорошая документация; - Отлично интегрируется с TypeScript, Vue Router, Vuex/Pinia. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чем смысл ограничений? Ограничения (constraints) – это правила, которые ограничивают возможные значения данных или ограничивают поведение системы. 🟠Ограничения в базах данных (SQL Constraints) В SQL ограничения гарантируют корректность данных в таблицах.
CREATE TABLE Users (
    id INT PRIMARY KEY,
    email VARCHAR(255) UNIQUE NOT NULL,
    age INT CHECK (age > 0),
    country VARCHAR(50) DEFAULT 'Unknown'
);
🟠Ограничения в Java Generics (`<T extends ...>`) Ограничения в Generics позволяют задавать допустимые типы.
class Box<T> {
    T value;
    public Box(T value) { this.value = value; }
}
Box<String> strBox = new Box<>("Hello");
Box<Integer> intBox = new Box<>(10);
class NumberBox<T extends Number> { // Ограничение: T должно быть числом
    T value;
    public NumberBox(T value) { this.value = value; }

    public double square() {
        return value.doubleValue() * value.doubleValue();
    }
}
🟠Ограничения в потоках (synchronized, volatile, join) В многопоточности ограничения помогают избежать гонок потоков.
class Counter {
    private int count = 0;

    public synchronized void increment() { // Только один поток может изменять count одновременно
        count++;
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница между Spring аннотациями Component, Repository и Service? - @Component — базовая аннотация для любого компонента; - @Service — специализированная аннотация для бизнес-логики; - @Repository — специализированная аннотация для слоя доступа к данным и обработки SQL-исключений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

🤔 Зачем нужна программа, которая работает в нескольких потоках, а не в одном? Многопоточность нужна, чтобы: - Выполнять несколько задач параллельно (например, UI + загрузка данных). - Улучшать производительность на многоядерных процессорах. - Повышать отзывчивость (асинхронная обработка). - Разделять задачи (производитель-потребитель, слушатели, обработчики событий). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое функциональный интерфейс? Функциональный интерфейс —это интерфейс, который содержит только один абстрактный метод. Это позволяет использовать лямбда-выражения для создания его анонимных реализаций, делая код более лаконичным и читаемым. Функциональные интерфейсы являются основой для лямбда-выражений и методов ссылок, начиная с версии 8. Примером этого может служить интерфейс java.util.function.Predicate<T> который принимает объект типа T и возвращает значение типа boolean. Вот пример использования: Predicate<String> isNotEmpty = s -> !s.isEmpty(); System.out.println(isNotEmpty.test("Hello")); // Выведет true System.out.println(isNotEmpty.test("")); // Выведет false Чтобы явно указать, что интерфейс предназначен для использования как функциональный, используется аннотация @FunctionalInterface. Эта аннотация не обязательна (компилятор может определить функциональный интерфейс и без неё), но она помогает в документировании кода и обеспечивает проверку времени компиляции, гарантируя, что интерфейс содержит только один абстрактный метод. @FunctionalInterface public interface SimpleFunction { int apply(int value); } // Использование SimpleFunction triple = value -> value * 3; System.out.println(triple.apply(5)); // Выведет 15 Ставь 👍 и забирай 📚 Базу знаний

Джунам тяжело, мидлам тесно, сеньорам норм - рынок java 2026
Я, Андрей Борисов, автор ютуб канала по java 16 лет опыт профессиональной разработки на java (A1 Austria Telecom Group, Qulix Systems, SDWORX) Вел 6 HIGH LOAD проектов Основатель школы JavaGuru.by 300+ учеников повысили квалификацию и перешли на современный стек, увеличив доход
Поделюсь анализом рынка, на основании опыта проведения 6 потоков по микросервисной архитектуре для повышения квалификации мидлов и 5 групп по трудоустройству мидлом за последний год Сегодня рынок стал жестче и интереснее. Java всё ещё в топе, но условия постоянно меняются. 1) Джунам тяжело, мидлам тесно, сеньорам норм Самая болезненная зона — Junior и слабый Middle: - много кандидатов - собеседования стали глубже, хотят уже system design даже Надо отметить, что прохождение собеседования это отдельный скилл, и, было достаточно случаев, когда ученик с нулевым опытом рисовал 4+ лет и залетал даже на синьорскую позицию, а с грамотным и опытным парнем мучались пол года пока прошел собес. 2) В 2025 году количество вакансий менялось волнообразно - Весной насколько помните было резкое падение количества после 2024 года - В июне-июле рынок ожил, мои ребята неплохо получали тех собесы и большинство устроились во время курса - Август-сентябрь очень мало вакансий, но в октябре стало легче, чуть хуже, но тоже нормально устроились ученики - В конце осени было совсем мало вакансий, до нового года в группе оффер получили 34% группы, остальные продолжили уже после праздников Сбербанк осенью провел оптимизацию сотрудников, довольно много java программистов с опытом вышло на рынок и плюс традиционное затишье к концу года 3) Теперь 4+ - Если в 2024 году резюме с 3+ работало, то в 2025 студенты академий заточенных конкретно на залет в ИТ, стали рисовать 4+ и резюме с 3+ стали плохо привлекать внимание HR - Если в 2025 очень редко были случаи проверки опыта, то к концу 2025 почти в половине случаев просили выгрузку с госуслуг трудовой или фото договоров ИП/ГПХ 4) Минимальный стек для собеса мидлом: - Spring / Spring Boot - микросервисные паттерны и в целом дизайн системы - Kafka/RabbitMQ - Docker + Kubernetes (хотя бы на уровне “понимаю”) - БД: PostgreSQL, Redis, Elastic - понимание CI/CD Рынок сместился от кодера к инженеру. И это главное отличие. 5) Что реально повышает шансы в 2026 - Подтверждение опыта - Реактивный стек - Опыт с high-load - Опыт в финтех - Опыт с продом: кубер, ci/cd, мониторинг, saga - Понимание архитектуры - Я лично пока не встречал ученика даже без реального опыта, который бы получив твердую мидловую квалификацию: шарит в кубере, экосистеме спринг вглубь и архитектуре и при этом не смог утроиться за пол года. Порог входа высокий, зато по сравнению с языками с низким порогом входа, при наличии реального уровня, трудоустройство гарантированно. ИТОГ: - ЗП не уменьшается. - Java в топе среди языков. - Устроиться сложно, надо учить) - IT профессии постепенно переходят в разряд обычных из хайповых, где хорошие спецы много получают, а на старте без опыта очень трудно устроиться. Здесь видео по: микросервисным паттернам SAGA и OUTBOX Apache Kafka Канал для повышения квалификации java Отзывы о курсе Профессиональная разработка микросервисов https://javaguru.by/ ❤️ Core -> Enterprise -> Bootcamp -> Микросервисы | Трудоустройство | РЕАКТИВНЫЙ СТЕК | ИТ-СТАРТАП-РЕТРИТ

🤔 Как из Spring-приложения обратиться к другому сервису? Есть несколько способов: - RestTemplate — синхронный вызов HTTP-запросов (устаревающий). - WebClient (из Spring WebFlux) — асинхронный и реактивный подход. - Feign (через Spring Cloud OpenFeign) — декларативный HTTP-клиент, автоматически связывает интерфейсы с REST-эндпоинтами. - gRPC, Kafka, AMQP — для межсервисного общения в распределённых системах. Чаще всего REST-взаимодействие строится через WebClient или Feign. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Чем stub отличается от mock? В тестировании разница между Stub и Mock заключается в их предназначении и способе использования. 🚩Stub (Заглушка) Stub – это простейший объект-заглушка, который возвращает заранее заданные данные. Он не проверяет, какие методы были вызваны, а просто отвечает на запросы.
class UserRepositoryStub implements UserRepository {
    @Override
    public User findById(Long id) {
        return new User(id, "Иван"); // Просто возвращает статичные данные
    }
}
🚩Mock (Макет) Mock – это объект, который имитирует поведение реального объекта и позволяет проверять вызовы методов (сколько раз был вызван, с какими аргументами и т. д.).
UserRepository userRepository = mock(UserRepository.class);
when(userRepository.findById(1L)).thenReturn(new User(1L, "Иван"));

User user = userRepository.findById(1L);

verify(userRepository, times(1)).findById(1L); // Проверяем, что метод был вызван 1 раз
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какие минусы REST в высоконагруженных системах? Избыточность (HTTP-заголовки), нет стандарта версионирования, нет поддержки двунаправленной связи, сложность в контроле схем. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 В чём различие между LeftJoin , RightJoin и InnerJoin? LEFT JOIN, RIGHT JOIN и INNER JOIN являются операциями соединения таблиц, каждая из которых используется для объединения строк из двух или более таблиц на основе связанных столбцов между ними. Различие между этими типами соединений заключается в том, какие строки выбираются для включения в результаты запроса. 🚩INNER JOIN Возвращает только те строки, которые имеют соответствующие значения в обеих таблицах. Если совпадение не найдено, строки не включаются в результаты. Это наиболее часто используемый тип соединения, так как он обеспечивает строгое соответствие между таблицами. 🚩LEFT JOIN (или LEFT OUTER JOIN) Возвращает все строки из левой таблицы (ТаблицаA), а также соответствующие строки из правой таблицы (ТаблицаB). Если совпадение в правой таблице не найдено, результат будет содержать NULL на месте столбцов правой таблицы. 🚩RIGHT JOIN (или RIGHT OUTER JOIN) Работает аналогично LEFT JOIN, но возвращает все строки из правой таблицы (ТаблицаB), а также соответствующие строки из левой таблицы (ТаблицаA). Если совпадение в левой таблице не найдено, результат будет содержать NULL на месте столбцов левой таблицы. INNER JOIN используется для получения строк с совпадениями в обеих таблицах. LEFT JOIN возвращает все строки из левой таблицы и соответствующие строки из правой таблицы; если соответствий нет, вместо столбцов правой таблицы будут NULL. RIGHT JOIN возвращает все строки из правой таблицы и соответствующие строки из левой таблицы; если соответствий нет, вместо столбцов левой таблицы будут NULL. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что известно про TargetMethod? Это понятие, связанное с рефлексией и аннотациями в Java. Оно относится к методу, к которому применяется аннотация или который вызывается через рефлексию (MethodHandle, Proxy). Используется в фреймворках (Spring, JPA) для динамического вызова методов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний