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

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

Open in Telegram

Сайт: 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 368 subscribers, ranking 10 619 in the Technologies & Applications category and 56 558 in the Russia region.

📊 Audience metrics and dynamics

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

According to the latest data from 02 September, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -29 over the last 30 days and by -12 over the last 24 hours, overall reach remains high.

  • Verification status: Not verified
  • Engagement rate (ER): The average audience engagement rate is 8.57%. Within the first 24 hours after publication, content typically collects 5.66% reactions from the total number of subscribers.
  • Post reach: On average, each post receives 974 views. Within the first day, a publication typically gains 643 views.
  • Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
  • 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 03 September, 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 368
Subscribers
-1224 hours
-367 days
-2930 days
Posts Archive
🤔 Что такое CompletableFuture? Это расширенный класс, реализующий интерфейсы Future и CompletionStage. Он предоставляет удобные методы для построения асинхронных цепочек задач, обработки исключений и комбинирования нескольких асинхронных операций. Это упрощает написание асинхронного кода и избегает блокировки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие методы жизненного цикла JSP могут быть переопределены ? Жизненный цикл JSP (JavaServer Pages) включает несколько ключевых методов, которые можно переопределить для управления поведением страницы. Эти методы определены в интерфейсе javax.servlet.jsp.HttpJspPage, который расширяет интерфейс javax.servlet.jsp.JspPage. 🟠`jspInit()` Этот метод запускается один раз при инициализации JSP. Он используется для выполнения начальных настроек, таких как создание объектов, которые будут использоваться на странице. Это аналог метода init() в сервлетах. 🟠jspDestroy() Этот метод вызывается перед удалением JSP со страницы сервера. Он используется для освобождения ресурсов или выполнения других задач очистки. Это аналог метода destroy() в сервлетах.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.io.*, java.util.*" %>
<%!
    // Поля класса
    private Resource resource;

    // Переопределение метода jspInit()
    public void jspInit() {
        // Инициализация ресурсов
        resource = new Resource();
        System.out.println("JSP инициализирована.");
    }

    // Переопределение метода jspDestroy()
    public void jspDestroy() {
        // Освобождение ресурсов
        resource.close();
        System.out.println("JSP уничтожена.");
    }
%>
<html>
<body>
    <h2>Пример переопределения методов жизненного цикла JSP</h2>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое Future? Это интерфейс в Java, представляющий результат асинхронной операции, который будет доступен в будущем. С помощью Future можно получить результат выполнения задачи, проверить её состояние или отменить задачу. Однако интерфейс имеет ограничения, такие как блокировка при ожидании результата. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что известно о методах жизненного цикла JSP ? Жизненный цикл JSP страницы включает несколько ключевых методов, которые управляют её поведением от момента создания до завершения. Эти методы позволяют выполнять действия при инициализации, обработке запросов и завершении работы страницы. 🚩jspInit() Этот метод вызывается контейнером сервлетов один раз при инициализации страницы. Он аналогичен методу init() в сервлетах и используется для выполнения любых действий, которые необходимо выполнить до обработки первого запроса, таких как настройка ресурсов, инициализация параметров и т.д.
public void jspInit() {
    // Код инициализации, например, подключение к базе данных или настройка ресурсов
    System.out.println("JSP инициализирована");
}
🚩_jspService(HttpServletRequest request, HttpServletResponse response) Этот метод автоматически генерируется для каждой страницы и отвечает за обработку каждого HTTP-запроса, направленного к этой странице. Метод обрабатывает входящие параметры запроса, выполняет бизнес-логику и формирует ответ, который отправляется обратно клиенту. Этот метод вызывается каждый раз при поступлении запроса к JSP странице.
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        // Генерация HTML содержимого
        out.println("<html><head><title>Example JSP</title></head><body>");
        out.println("<h1>Welcome to JSP</h1>");
        out.println("<p>Current time: " + new java.util.Date() + "</p>");
        out.println("</body></html>");
    }
}
🚩jspDestroy() Этот метод вызывается контейнером сервлетов один раз при завершении работы страницы. Он аналогичен методу destroy() в сервлетах и используется для выполнения любых действий, которые необходимо выполнить перед выгрузкой страницы, таких как освобождение ресурсов, закрытие соединений и т.д.
public void jspDestroy() {
    // Код очистки ресурсов, например, закрытие соединений с базой данных
    System.out.println("JSP завершила работу");
}
🚩Как эти методы взаимодействуют в жизненном цикле 🟠Инициализация (Initialization) Контейнер вызывает jspInit() при первой загрузке страницы. Этот метод инициализирует необходимые ресурсы и выполняет любые действия, которые должны быть выполнены один раз. 🟠Обработка запросов (Request Processing) Каждый запрос к странице обрабатывается методом _jspService(). Контейнер сервлетов передает объекты HttpServletRequest и HttpServletResponse этому методу для обработки запроса и формирования ответа. 🟠Завершение (Termination) Когда контейнер выгружает страницу (например, при завершении работы приложения или перезагрузке сервера), вызывается метод jspDestroy(). Этот метод освобождает все ресурсы, занятые страницей, и выполняет любые действия по очистке.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<%@ page import="java.io.*" %>

<%
    // Инициализация (имитация вызова jspInit)
    application.log("JSP инициализирована");
%>

<html>
<head>
    <title>Example JSP</title>
</head>
<body>
    <h1>Welcome to JSP</h1>
    <p>Current time: <%= new Date() %></p>
</body>
</html>

<%
    // Завершение (имитация вызова jspDestroy)
    application.log("JSP завершила работу");
%>
Ставь 👍 и забирай 📚 Базу знаний

Каждый ITшник получает от 250к Оставьте эту чушь для курсов, на которых дают обещания вместо реальных знаний. В 2025 году пол
Каждый ITшник получает от 250к Оставьте эту чушь для курсов, на которых дают обещания вместо реальных знаний. В 2025 году получить заветный оффер сможет только тот, у кого есть эти 10 мануалов: – Пошаговая road map по Java – Redis - 5 улучшений для твоего пет-проекта – Пошаговая RoadMap по Java – Мануал по Docker. Основные команды и концепции – Микросервисы. Вопросы с собеседований – Шпаргалка с горячими клавишами JetBrains IDE. Ускоришь работу в 10 раз – Шпаргалка по Kafka – Инструкция по работе с Git – Подробный гайд, как найти работу в IT без опыта – Подборка платформ с вакансиями для java-разработчиков Ребята из FAANG School собрали бесплатную библиотеку Java Junior с мега полезными материалами, которые помогут освоить сложные темы, упростить и ускорить работу, а также получить приглашение от IT-гигантов. Свежее пополнение - то, без чего не обойтись ни одному джуну - шпаргалка по основным командам SQL! Забрать можно по оранжевой кнопке. Доступ открыт всего на сутки - успевай.

🤔 Что такое синхронизация и зачем она нужна? Это механизм управления доступом к общим ресурсам в многопоточной среде, чтобы избежать конфликтов и некорректного поведения. Она обеспечивает выполнение критических секций кода одним потоком в любой момент времени. Синхронизация предотвращает состояния гонки и гарантирует согласованность данных. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что известно об этапах (фазах) жизненного цикла JSP ? Жизненный цикл JSP страницы включает несколько этапов, которые происходят с момента запроса страницы клиентом до ее ответа. Эти этапы позволяют сервлет-контейнеру управлять страницей, обеспечивая её корректное выполнение и оптимизацию. 🟠Перевод (Translation) На этом этапе страница переводится в сервлетный код. Это означает, что JSP контейнер берет исходный код страницы и генерирует соответствующий Java код для сервлета.
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Example JSP</title>
</head>
<body>
    <h1>Welcome to JSP</h1>
    <p>Current time: <%= new java.util.Date() %></p>
</body>
</html>
🟠Компиляция (Compilation) Переведенный сервлетный код компилируется в байт-код (класс-файл). Это стандартная компиляция Java, которая создает скомпилированный класс из Java исходного кода. 🟠Загрузка (Loading) На этом этапе скомпилированный класс загружается в память JVM (Java Virtual Machine). Это стандартный процесс загрузки классов в Java, осуществляемый класс-загрузчиком. 🟠Инициализация (Initialization) Контейнер вызывает метод jspInit() сервлета, который соответствует JSP странице. Этот метод аналогичен методу init() в обычных сервлетах и вызывается один раз, когда сервлет загружается в память. Здесь можно выполнять любые операции инициализации, такие как настройка ресурсов.
public void jspInit() {
    // Инициализационный код
}
🟠Обработка запроса (Request Processing) Когда клиент отправляет запрос к JSP странице, контейнер создает объекты HttpServletRequest и HttpServletResponse и передает их методу jspService(), который обрабатывает запросы и генерирует ответ. Этот метод вызывается каждый раз при поступлении запроса.
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    try (PrintWriter out = response.getWriter()) {
        out.println("<html><head><title>Example JSP</title></head><body>");
        out.println("<h1>Welcome to JSP</h1>");
        out.println("<p>Current time: " + new java.util.Date() + "</p>");
        out.println("</body></html>");
    }
}
🟠Завершение (Termination) Когда контейнер решает выгрузить JSP страницу (например, при завершении работы приложения или перезагрузке сервера), он вызывает метод jspDestroy(). Этот метод аналогичен методу destroy() в обычных сервлетах и позволяет выполнять любые операции очистки, такие как освобождение ресурсов.
public void jspDestroy() {
    // Очистка ресурсов
}
Ставь 👍 и забирай 📚 Базу знаний

– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с тру
– Помощь с pet-проектом – Составление roadmap – Общая консультация – Проведение код-ревью и mock-собеседования – Помощь с трудоустройством Все это и многое другое может Ментор. Он обеспечит вам необходимый boost, ускорит и упростит вход в IT. 🔥 Здесь размещен список менторов, и многие из них предлагают бесплатную первую консультацию

🤔 Что такое Dispatcher Servlet? Центральный компонент в Spring MVC, который обрабатывает входящие HTTP-запросы. Он распределяет запросы к соответствующим контроллерам, управляет данными и формирует ответы. Этот компонент действует как координатор между различными частями приложения, такими как контроллеры, сервисы и представления. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю ? Процесс обработки JSP страницы начинается с запроса от клиента к серверу и заканчивается ответом серверу клиенту. Этот процесс включает несколько этапов, в которых страница компилируется в сервлет, выполняется, и результат возвращается клиенту. 1⃣Запрос клиента Когда клиент (обычно это веб-браузер) отправляет HTTP-запрос для получения страницы, запрос передается на веб-сервер. 2⃣Передача запроса на сервлет-контейнер Веб-сервер, получив запрос, передает его на сервлет-контейнер (например, Apache Tomcat), который обрабатывает запросы для JSP страниц. 3⃣Проверка и компиляция Проверка необходимости компиляции: Первый запрос или обновление: Если это первый запрос к данной JSP странице или если страница была изменена, сервлет-контейнер проверяет, скомпилирована ли JSP страница. Кеширование: Если страница уже была скомпилирована и не изменялась, этот шаг пропускается. Компиляция: Страница компилируется в сервлетный код (Java класс). Сервлетный код компилируется в байт-код (класс-файл). 4⃣Загрузка и инициализация сервлета Скомпилированный сервлет загружается в память, и контейнер вызывает метод init(), если сервлет еще не был загружен. 5⃣Обработка запроса Контейнер создает объекты HttpServletRequest и HttpServletResponse, представляющие запрос клиента и ответ сервера соответственно, и передает их методу service() сервлета, который затем вызывает соответствующие методы doGet() или doPost().
public class ExampleJspServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h1>Dynamic content from JSP</h1>");
        out.println("<p>Current time: " + new java.util.Date() + "</p>");
        out.println("</body></html>");
    }
}
6⃣Выполнение сервлета Сервлет выполняет свою логику, включая: Доступ к параметрам запроса. Взаимодействие с базой данных или другими серверными ресурсами. Динамическое создание HTML контента. 7⃣Формирование ответа Сервлет формирует HTML страницу, которая возвращается клиенту. Содержимое передается через объект HttpServletResponse. 8⃣Отправка ответа клиенту Ответ возвращается через веб-сервер клиенту (например, браузеру), который отображает полученный HTML контент пользователю.
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Example JSP</title>
</head>
<body>
    <h1>Welcome to JSP</h1>
    <p>Current time: <%= new java.util.Date() %></p>
</body>
</html>
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое bean, какую роль он играет в Spring'е? Это объект, управляемый контейнером Spring, который отвечает за его создание, настройку и управление жизненным циклом. Bean'ы используются для инъекции зависимостей и являются ключевой частью реализации IoC (Inversion of Control). Они позволяют отделить создание объектов от их использования. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Для чего нужно стирание типов? Это механизм, используемый в Java для обеспечения обратной совместимости между старым кодом, написанным до введения обобщений (generics) в Java 5, и новым кодом, который их использует. Стирание типов позволяет компилировать обобщенный код в байт-код, совместимый с JVM, который не поддерживает обобщения. 🚩Основные цели стирания типов 🟠Обратная совместимость Позволяет использовать старый код, написанный до введения обобщений, вместе с новым обобщенным кодом без изменений в существующем коде. 🟠Сокращение избыточности Обеспечивает единообразие работы с различными типами, минимизируя избыточность в коде и устраняя необходимость дублирования кода для разных типов. 🚩Как работает стирание типов При компиляции обобщенного кода компилятор Java удаляет информацию о типах (стирает типы) и заменяет их на их необобщенные версии или верхние границы (bounds). В результате обобщенный код компилируется в байт-код, который может выполняться на обычной JVM. Обобщенный класс
public class Box<T> {
    private T value;

    public void set(T value) {
        this.value = value;
    }

    public T get() {
        return value;
    }
}
После стирания типов компилированный код будет выглядеть примерно так
public class Box {
    private Object value;

    public void set(Object value) {
        this.value = value;
    }

    public Object get() {
        return value;
    }
}
🚩Ограничения и последствия стирания типов 🟠Потеря информации о типе во время выполнения После стирания типов информация о типах удаляется, и во время выполнения типовые параметры становятся объектами Object. 🟠Невозможность использования примитивных типов Обобщения работают только с ссылочными типами, так как примитивные типы не могут быть использованы в качестве типовых параметров. 🟠Рефлексия и обобщения Невозможно получить информацию о типовых параметрах через рефлексию, так как она теряется во время компиляции. 🚩Пример ограничения Невозможность создания массивов обобщенных типов
public class Box<T> {
    private T value;

    public T[] createArray(int size) {
        return new T[size]; // Ошибка компиляции
    }
}
Обходное решение с использованием рефлексии
public class Box<T> {
    private T value;
    private Class<T> type;

    public Box(Class<T> type) {
        this.type = type;
    }

    @SuppressWarnings("unchecked")
    public T[] createArray(int size) {
        return (T[]) java.lang.reflect.Array.newInstance(type, size);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Расскажи про иерархию интерфейсов Collection Framework. 1. Collection — базовый интерфейс, от которого наследуются все коллекции. 2. List (например, ArrayList, LinkedList) — упорядоченные коллекции, поддерживающие дублирующиеся элементы. 3. Set (например, HashSet, TreeSet) — коллекции, хранящие только уникальные элементы. 4. Queue (например, PriorityQueue, LinkedList) — коллекции с FIFO-поведеним. 5. Map — пары ключ-значение (HashMap, TreeMap) — не наследуется от Collection. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Какие могут проблемы при реализации Hashcode? Реализация метода hashCode в Java может привести к нескольким проблемам, если она сделана неправильно. Эти проблемы могут привести к некорректной работе хэш-структур данных, таких как HashMap, HashSet и другие. Рассмотрим основные проблемы, которые могут возникнуть при неправильной реализации метода hashCode. 🚩Основные проблемы 🟠Нарушение контракта между `equals` и `hashCode` Если два объекта равны согласно методу equals, они должны иметь одинаковый хэш-код. Нарушение этого правила приведет к тому, что объекты, которые равны с точки зрения equals, могут оказаться в разных корзинах хэш-таблицы. Убедитесь, что если equals возвращает true для двух объектов, то их хэш-коды одинаковы.
@Override
public boolean equals(Object obj) {
    // Реализация метода equals
}

@Override
public int hashCode() {
    // Реализация метода hashCode
}     
🟠Изменяемые объекты в качестве ключей Если объект, который используется в качестве ключа в HashMap, изменяется таким образом, что изменяется его хэш-код, это может привести к тому, что объект станет недоступным. Избегайте использования изменяемых объектов в качестве ключей в хэш-таблицах или обеспечьте, чтобы поля, влияющие на хэш-код, не изменялись после создания объекта.
// Плохой пример
Map<Person, String> map = new HashMap<>();
Person person = new Person("Alice");
map.put(person, "Engineer");
person.setName("Bob"); // Изменение, влияющее на hashCode
String profession = map.get(person); // Может вернуть null     
🟠Неравные объекты с одинаковым хэш-кодом Два неравных объекта могут иметь одинаковый хэш-код, что приведет к увеличению числа коллизий. Это может снизить производительность хэш-таблицы. Хотя это невозможно полностью избежать, хорошая реализация hashCode должна стараться минимизировать количество таких коллизий.
@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + (name != null ? name.hashCode() : 0);
    result = 31 * result + age;
    return result;
}     
🟠Производительность метода `hashCode` Если метод hashCode реализован неэффективно, это может привести к снижению производительности всей программы. Убедитесь, что метод hashCode выполняется быстро и эффективно, особенно для часто используемых объектов. 🟠Сложные вычисления хэш-кода Слишком сложные вычисления в методе hashCode могут негативно сказаться на производительности. Используйте простые и эффективные алгоритмы для вычисления хэш-кода.
@Override
public int hashCode() {
    return Objects.hash(name, age);
}
     
Пример правильной реализации equals и hashCode
import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое volatile? Это ключевое слово в Java, используемое для обозначения переменной, значение которой может изменяться несколькими потоками. Оно гарантирует, что все потоки будут видеть актуальное значение переменной, избегая кеширования в потоках. Однако volatile не обеспечивает атомарность операций. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое heap, stack? В контексте Java, Heap (куча) и Stack (стек) являются областями памяти, используемыми JVM для управления памятью, необходимой для выполнения программы. Каждая из этих областей имеет свои характеристики и используется для разных целей. 🚩Heap (Куча) Heap — это область памяти, выделенная для динамического распределения памяти объектов и массивов. Все объекты, созданные с использованием оператора new, размещаются в куче. 🟠Особенности Куча разделена на поколения: молодое поколение (Young Generation) и старое поколение (Old Generation). Молодое поколение включает в себя области Eden Space и Survivor Spaces (S0 и S1). Старое поколение хранит долгоживущие объекты. 🟠Управление памятью Куча управляется сборщиком мусора (Garbage Collector), который автоматически освобождает память, занятую объектами, которые больше не используются. 🟠Использование Куча используется для хранения объектов, массивов и классов, информация о которых сохраняется на протяжении всего времени их жизни.
public class Example {
    public static void main(String[] args) {
        Example obj = new Example(); // obj создается в куче
    }
}
🚩Stack (Стек) Стек — это область памяти, используемая для управления вызовами методов и хранения локальных переменных, параметров методов и информации о возвратах. 🟠Особенности Каждый поток имеет свой собственный стек. Стек хранит кадры (frames) для каждого вызова метода. Каждый кадр содержит локальные переменные метода и информацию о вызовах. 🟠Управление памятью Память в стеке автоматически управляется при вызове методов и выходе из них. Когда метод вызывается, создается новый кадр в стеке; когда метод завершает выполнение, его кадр удаляется из стека. 🟠Использование Стек используется для хранения примитивных типов данных и ссылок на объекты, которые находятся в куче. Локальные переменные методов и параметры методов хранятся в стеке.
public class Example {
    public static void main(String[] args) {
        int localVar = 10; // localVar хранится в стеке
        Example obj = new Example(); // Ссылка на obj хранится в стеке, а сам объект — в куче
        obj.method();
    }

    public void method() {
        int anotherVar = 20; // anotherVar хранится в стеке
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Какую структуру данных реализует LinkedList? Реализует связанную структуру данных — двусвязный список. Каждый узел содержит данные и ссылки на предыдущий и следующий элементы, что делает добавление и удаление эффективным, но доступ к элементам — медленным (линейный поиск). Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Что такое модификатор default equals и hashcode? Модификаторы доступа в Java определяют уровень доступа к классам, методам и переменным. Однако, если говорить о equals и hashCode в контексте модификаторов, то мы имеем в виду их реализацию по умолчанию, предоставляемую классом java.lang.Object. 🚩Реализация 🟠Метод `equals` по умолчанию Метод equals в классе Object по умолчанию проверяет, являются ли два объекта одним и тем же экземпляром. Это проверка на ссылочное равенство.
public boolean equals(Object obj) {
    return (this == obj);
}
🟠Метод `hashCode` по умолчанию Метод hashCode в классе Object по умолчанию возвращает уникальный целочисленный идентификатор для каждого объекта. Этот идентификатор обычно представляет собой адрес объекта в памяти.
public native int hashCode();
🚩Когда нужно переопределять Переопределение методов equals и hashCode необходимо, когда вы хотите, чтобы два различных объекта были равны, если их состояния равны, а не если они являются одним и тем же объектом.
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public static void main(String[] args) {
        Person p1 = new Person("Alice", 25);
        Person p2 = new Person("Alice", 25);

        System.out.println(p1.equals(p2)); // true
        System.out.println(p1.hashCode() == p2.hashCode()); // true
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 Массив — статическая структура данных или динамическая? Является статической структурой данных, так как его размер задаётся при создании и не может изменяться. Однако содержимое массива можно изменять, а для работы с динамическими структурами лучше использовать коллекции, такие как ArrayList. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Когда stream начинает свое выполнение? В Java Streams API потоки данных (Stream) начинают своё выполнение только при вызове терминального операции. Это ключевая особенность, которая отличает ленивые (lazy) промежуточные операции от жадных (eager) терминальных операций. 🚩Промежуточные и терминальные операции 🟠Промежуточные операции (Intermediate Operations) Промежуточные операции возвращают новый поток и не инициируют выполнение. Они являются ленивыми, то есть, они откладывают выполнение до тех пор, пока не будет вызвана терминальная операция. Примеры: filter, map, sorted, distinct, flatMap, и т.д. Промежуточные операции составляют цепочку, которая настраивает конвейер обработки данных.
Stream<String> stream = Stream.of("one", "two", "three")
    .filter(s -> s.length() > 3)
    .map(String::toUpperCase);   
🟠Терминальные операции (Terminal Operations) Терминальные операции запускают выполнение всего конвейера потоков. Они потребляют поток и возвращают либо результат, либо выполняют побочные действия. Примеры: forEach, collect, reduce, count, findFirst, findAny, allMatch, noneMatch, и т.д.
long count = stream.count(); // Запуск выполнения   
🚩Пример Рассмотрим пример, где промежуточные операции filter и map не инициируют выполнение, а только настройку конвейера. Выполнение начинается только при вызове терминальной операции forEach.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

        // Настройка конвейера операций
        Stream<String> nameStream = names.stream()
            .filter(name -> {
                System.out.println("Filter: " + name);
                return name.length() > 3;
            })
            .map(name -> {
                System.out.println("Map: " + name);
                return name.toUpperCase();
            });

        System.out.println("Before terminal operation");

        // Терминальная операция, которая запускает выполнение
        nameStream.forEach(name -> System.out.println("Final result: " + name));

        System.out.println("After terminal operation");
    }
}
🚩Ожидаемый вывод Вывод на экран покажет, что промежуточные операции выполняются только при вызове терминальной операции.
Before terminal operation
Filter: Alice
Map: Alice
Final result: ALICE
Filter: Bob
Filter: Charlie
Map: Charlie
Final result: CHARLIE
Filter: David
Map: David
Final result: DAVID
After terminal operation
Ставь 👍 и забирай 📚 Базу знаний