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

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

رفتن به کانال در Telegram

📈 تحلیل کانال تلگرام Java | Вопросы собесов

کانال Java | Вопросы собесов (@easy_java_ru) در بخش زبانی روسی بازیگری فعال است. در حال حاضر جامعه شامل 11 451 مشترک است و جایگاه 10 914 را در دسته فناوری و برنامه‌ها و رتبه 57 532 را در منطقه روسيا دارد.

📊 شاخص‌های مخاطب و پویایی

از زمان ایجاد در невідомо، پروژه رشد سریعی داشته و 11 451 مشترک جذب کرده است.

بر اساس آخرین داده‌ها در تاریخ 04 ژوئن, 2026، کانال فعالیت پایداری دارد. در ۳۰ روز گذشته تغییر اعضا برابر 15 و در ۲۴ ساعت گذشته برابر -3 بوده و همچنان دسترسی گسترده‌ای حفظ شده است.

  • وضعیت تأیید: تأیید نشده
  • نرخ تعامل (ER): میانگین تعامل مخاطب 7.92% است و در ۲۴ ساعت نخست پس از انتشار، محتوا معمولاً 7.64% واکنش نسبت به کل مشترکان کسب می‌کند.
  • دسترسی پست‌ها: هر پست به طور میانگین 907 بازدید دریافت می‌کند. در اولین روز معمولاً 874 بازدید جمع‌آوری می‌شود.
  • واکنش‌ها و تعامل: مخاطبان به‌طور فعال حمایت می‌کنند؛ میانگین واکنش به هر پست 0 است.
  • علایق موضوعی: محتوا بر موضوعات کلیدی مانند ставь, void, string, строка, static تمرکز دارد.

📝 توضیح و سیاست محتوایی

نویسنده این فضا را محل بیان دیدگاه‌های شخصی توصیف می‌کند:
Cайт easyoffer.ru Реклама @easyoffer_adv ВП @easyoffer_vp Тесты t.me/+icUwivvbGOkwNWRi Задачи t.me/+8eqUTboisnkyZjQy Вакансии t.me/+4pspF5nDjgM4MjQy

به لطف به‌روزرسانی‌های پرتکرار (آخرین داده در تاریخ 05 ژوئن, 2026)، کانال همواره به‌روز و دارای دسترسی بالاست. تحلیل‌ها نشان می‌دهد مخاطبان به‌طور فعال با محتوا تعامل دارند و آن را به نقطه اثرگذاری مهم در دسته فناوری و برنامه‌ها تبدیل کرده‌اند.

11 451
مشترکین
-324 ساعت
-177 روز
+1530 روز
آرشیو پست ها
🤔 Что такое branch в Git? Branch — это ветка разработки, представляющая собой указатель на цепочку коммитов. Позволяет изолировать работу над задачами, не затрагивая основную ветку. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

🤔 Как коммитить код? - Используй понятные и осмысленные сообщения (feat: добавлен компонент, fix: починена валидация); - Следуй conventional commits при командной работе (например, feat, fix, refactor, docs); - Разделяй коммиты по смыслу — один коммит = одна логическая единица; - Проверяй код перед коммитом (git diff, git status); - Используй git commit -m "сообщение" или через git commit, чтобы открыть редактор и дать более развёрнутое описание. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Бесплатный онлайн-марафон для руководителей Два дня практических онлайн-встреч с топ-экспертами в области управления — на них
Бесплатный онлайн-марафон для руководителей Два дня практических онлайн-встреч с топ-экспертами в области управления — на них расскажем, как выстроить слаженную работу сотрудников и забыть о хаосе с помощью автоматизации. Спикеры Битрикс24, SETTERS EDUCATION, «ВкусВилл» и Максим Батырев расскажут: — как обеспечить рост команды без регламентов и ручного управления — как мотивировать сотрудников и давать обратную связь — как управлять большим потоком задач и контролировать их выполнение — как выстраивать эффективную коммуникацию с командой Бонусы для всех участников: — чек-лист: «Как обезопасить команду от кибермошенников?» — бесплатная консультация по автоматизации командной работы Бесплатно. 17–18 марта. Подробная программа мероприятия и регистрация — на сайте. Узнать больше #реклама 16+ marathon.bitrix24.works О рекламодателе

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

Бесплатный курс: веб-дизайн, графика, интерфейсы Научись создавать дизайн сайтов и приложений, инфографику для карточек на ма
Бесплатный курс: веб-дизайн, графика, интерфейсы Научись создавать дизайн сайтов и приложений, инфографику для карточек на маркетплейсах и работать в Figma! Студенты курса в среднем зарабатывают от 68 000 ₽ уже во время обучения💰 Этот курс для тебя, если ты: ✅ мечтаешь о новой профессии, но не знаешь, с чего начать; ✅ чувствуешь, что хочешь большего — свободы, самореализации, творчества; ✅ полный новичок и хочешь систему, а не хаос; ✅ хочешь начать зарабатывать удалённо. Зарегистрироваться #реклама 16+ ydaev.ru О рекламодателе

🤔 Чем отличается волатильность от атомарности? - Волатильность (volatile) — это гарантия того, что переменная будет читаться напрямую из памяти, а не из кеша потока. Она обеспечивает видимость изменений между потоками, но не гарантирует целостность операций. - Атомарность — это свойство, при котором операция выполняется целиком и неделимо, не может быть прервана. Например, инкремент — не атомарен без дополнительной синхронизации. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Нужны 12 человек для работы с искусственным интеллектом Требования: 18-45 лет Работа из дома. График свободный. Пришло задани
Нужны 12 человек для работы с искусственным интеллектом Требования: 18-45 лет Работа из дома. График свободный. Пришло задание — изучили — выполнили — получили свои деньги. Деньги вы получаете в зависимости от сложности задания. Например: За задание могут платить 500-10.000 рублей. 500 рублей — это около 5-30 минут. 10 000 руб. это 5-6 часов. Работа может быть разной: Оживить фото, создать видео, реставрировать старое фото и т.д. 💰 В среднем новичок получает до 150.000 руб в месяц. А опытный может и 300-500т. Мы обучим вас сами: ✅ 3 дня уроков по 30 минут ✅ Домашки с проверкой и оплатой бонусами ✅ Платим 10 тыс за каждую выполненную домашку ⚡ Набор заканчивается завтра. Для регистрации жмите кнопку "Зарегистрироваться": Зарегистрироваться #реклама 16+ neuromachina.ru О рекламодателе

🤔 Что такое «пространство имен» в XML? Пространство имен (namespace) в XML используется для различения одинаковых элементов с разными значениями в одном документе, чтобы избежать конфликтов между элементами разных схем. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Используешь в работе Lambda-выражения? Да, лямбда-выражения являются важной частью современной разработки на Java, и я активно их использую в своей работе. Лямбда-выражения помогают писать более лаконичный и выразительный код, особенно при работе с коллекциями и потоками данных. Вот несколько распространенных случаев использования лямбда-выражений в Java: 🟠Итерация по коллекциям Использование лямбда-выражений с методом forEach позволяет компактно и удобно итерировать по элементам коллекций.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
🟠Фильтрация и преобразование коллекций С использованием Stream API и лямбда-выражений можно легко фильтровать, сортировать и преобразовывать коллекции.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .collect(Collectors.toList());

filteredNames.forEach(System.out::println); // Вывод: Alice
🟠Сортировка коллекций Лямбда-выражения упрощают сортировку коллекций с использованием метода sort.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort((name1, name2) -> name1.compareTo(name2));
names.forEach(System.out::println);
🟠Использование функциональных интерфейсов Лямбда-выражения широко используются с функциональными интерфейсами, такими как Predicate, Function, Consumer и Supplier.
// Predicate
Predicate<String> startsWithA = s -> s.startsWith("A");
boolean result = startsWithA.test("Alice"); // true

// Function
Function<String, Integer> lengthFunction = s -> s.length();
int length = lengthFunction.apply("Hello"); // 5

// Consumer
Consumer<String> printConsumer = s -> System.out.println(s);
printConsumer.accept("Hello, World!"); // Вывод: Hello, World!

// Supplier
Supplier<String> stringSupplier = () -> "Hello, Supplier!";
String suppliedString = stringSupplier.get();
System.out.println(suppliedString); // Вывод: Hello, Supplier!
🟠Параллельные вычисления Лямбда-выражения с использованием параллельных потоков позволяют легко выполнять параллельные вычисления.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.parallelStream()
    .mapToInt(Integer::intValue)
    .sum();

System.out.println("Sum: " + sum); // Вывод: Sum: 15
🚩Пример использования в реальном проекте Предположим, у нас есть список сотрудников, и мы хотим отфильтровать и отсортировать их по имени.
import java.util.*;
import java.util.stream.Collectors;

class Employee {
    private String name;
    private int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Employee{name='" + name + "', age=" + age + '}';
    }
}

public class LambdaExample {
    public static void main(String[] args) {
        List<Employee> employees = Arrays.asList(
            new Employee("Alice", 30),
            new Employee("Bob", 25),
            new Employee("Charlie", 35),
            new Employee("David", 28)
        );

        // Фильтрация и сортировка сотрудников по имени
        List<Employee> filteredAndSorted = employees.stream()
            .filter(e -> e.getAge() > 27)
            .sorted(Comparator.comparing(Employee::getName))
            .collect(Collectors.toList());

        filteredAndSorted.forEach(System.out::println);
    }
}
Ставь 👍 и забирай 📚 Базу знаний

🤔 К каким конструкциям Java применим модификатор static? static может применяться к: - Полям (общим для всех экземпляров) - Методам (не привязанным к объекту) - Блокам инициализации (выполняемым при загрузке класса) - Вложенным классам (не требующим экземпляра внешнего класса) - Импортам (для упрощения обращения к статическим членам других классов) Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

OUTBOX pattern Недостаток коробочного решения от Spring для согласования двух разных транзакций понятен - нет 100% гарантии с
OUTBOX pattern Недостаток коробочного решения от Spring для согласования двух разных транзакций понятен - нет 100% гарантии согласованности транзакций (В этом посте детально) Как OUBOX решает проблему согласованности транзакций в разные системы? 1) Создаем табличку outbox 2) Оставляем @ Transactional на методе как и раньше, НО ВМЕСТО ТОГО ЧТОБЫ ПИСАТЬ В КАФКУ СОЗДАЕМ ЗАПИСЬ В ТАБЛИЦЕ OUTBOX ‼️Здесь вся магия OUTBOX - теперь и первое действие и второе находятся под управлением JPA transaction manager выполняются в рамках одной транзакции. Мы заменили отправку в кафку записью в БД, сказав, что в кафку надо что-то отправить 3) Вешаем @ Scheduled на метод который будет читать табличку outbox Здесь в аннотации можем настроить периодичность чтения, по сути задержку отправки в кафку сообщения ‼️Если транзакция прошла и сообщение попало в табличку outbox мы уже гарантируем, что рано или поздно обработаем эту строку и в кафку сообщение пойдет Шедулер может выглядеть так:

@RequiredArgsConstructor
@Component
public class OutboxScheduler {
    
    private final OutboxService outboxService;

    @Scheduled(fixedDelay = 10_000)
    public void run() {
        outboxService.processAll();
    }
}
Сервис:
 @Transactional
    public void processAll() {
        outboxRepository
                .selectForProcessing()
                .forEach(this::process);
    }

    private void process(OutboxRecord outboxRecord) {
        try {
            recordProcessor.process(outboxRecord);
            outboxRepository.delete(outboxRecord);
            log.info("Processed data: {}", outboxRecord.getPayload());
        } catch (Exception e) {
            log.warn("Failed to process data", e);
        }
    }
Минусы такого подхода: 1) От задержки в обработке никуда не деться 2) Самописное решение - усложнение поддержки проекта 3) Нагрузка на базу 4) Трудности, которые надо решать разруливая доступ к outbox табличке когда есть несколько реплик микра Но и с этими недостатками можно поработать и с большего убрать! Как? Kafka Connect, Debezium, Kafka Streams Здесь ВИДЕО разбор OUTBOX на youtube и rutube А здесь SAGA Как освоить микросервисную архитекруру на практике! https://javaguru.by❤️ Core -> Enterprise -> Bootcamp -> Микросервисы | Трудоустройство | РЕАКТИВНЫЙ СТЕК | ИТ-СТАРТАП-РЕТРИТ | СВОЕ ДЕЛО

🤔 Назови основные свойства транзакции В базах данных и многопоточных системах транзакция — это атомарная последовательность операций, которая должна выполняться корректно и полностью. 🚩Атомарность (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) — "данные не теряются" После успешного завершения транзакции данные не должны теряться даже при сбоях (например, отключении электричества). Ставь 👍 и забирай 📚 Базу знаний

🤔 Как называется функциональный интерфейс, который принимает в себя фильтр? Функциональный интерфейс, который используется для фильтрации, называется Predicate. Он принимает объект и возвращает true или false, в зависимости от условия. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

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

🤔 Как осуществляется вставка значений в HashMap? 1. Вычисляется hashCode() ключа. 2. Определяется индекс бакета. 3. Если бакет пуст — вставка. 4. Если есть коллизии — сравнение через equals(), цепочка или дерево. 5. При превышении порога — расширение массива. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

🤔 Расскажи про способы оптимизации запросов в БД Оптимизация запросов в базе данных (БД) — это процесс улучшения их производительности, чтобы они выполнялись быстрее и использовали меньше ресурсов. Рассмотрим основные способы оптимизации SQL-запросов. 🟠Индексы Индексы ускоряют поиск данных, создавая структуру, похожую на оглавление книги. Вместо полного перебора таблицы (Full Table Scan), БД быстро находит нужные строки по индексу.
CREATE INDEX idx_user_name ON users(name);
🟠Оптимизация `SELECT` Избегайте SELECT *, так как это нагружает систему избыточными данными. Плохо
SELECT * FROM users;
Хорошо
SELECT id, name FROM users;
🟠Использование `EXPLAIN` Перед оптимизацией полезно посмотреть, как БД выполняет запрос.
EXPLAIN SELECT * FROM users WHERE name = 'Ivan';
🟠Ограничение выборки (`LIMIT`, `OFFSET`) Если вам нужно получить только первые N строк, используйте LIMIT, чтобы БД не грузила лишние данные.
SELECT * FROM users ORDER BY id LIMIT 10;
🟠Оптимизация `JOIN` Соединение (JOIN) таблиц может быть дорогостоящим. Вот несколько рекомендаций: - Используйте индексы на полях, участвующих в JOIN. - Если возможно, замените сложные JOIN на подзапросы (EXISTS, IN).
CREATE INDEX idx_orders_user_id ON orders(user_id);
🟠Кеширование запросов Часто повторяющиеся запросы можно кэшировать на уровне БД (QUERY CACHE в MySQL) или в приложении (Redis, Memcached).
SET GLOBAL query_cache_size = 1000000;
🟠Нормализация и денормализация Нормализация уменьшает дублирование данных, разбивая таблицы. Денормализация может ускорить работу, дублируя данные и уменьшая количество JOIN. Ставь 👍 и забирай 📚 Базу знаний

Внимание ученики 1-11 класса и их родители! С 16 марта стартует бесплатная 2-х месячная программа по углубленному изучению шк
Внимание ученики 1-11 класса и их родители! С 16 марта стартует бесплатная 2-х месячная программа по углубленному изучению школьных предметов с 1 по 4 класс, с 5 по 8 класс и с 9 по 11 класс. Программа предлагает подтянуть знания по основным предметам: — Математика: 83% учеников повышают оценку до 4 или 5 за 2 месяца — Подготовиться к контрольным и ВПР — Подготовка к ОГЭ и ЕГЭ без стресса — Русский язык: средний балл ВПР 87 при общешкольном показателе 65 — Английский: 72% учащихся переходят на уровень выше за 4 месяца Для участия достаточно заполнить заявку. Жмите "Записаться" Записаться #реклама 16+ mrqz.me О рекламодателе

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

🤔 Чем полезны неизменяемые (Immutable) объекты в Java? Неизменяемые (immutable) объекты не могут быть изменены после создания. Если нужно изменить данные – создаётся новый объект. 🚩Почему неизменяемые объекты полезны? 🟠Потокобезопасность (Thread Safety) Неизменяемые объекты можно безопасно использовать в многопоточной среде – их не нужно синхронизировать.
String message = "Hello";
String newMessage = message.replace("H", "J");

System.out.println(message); // Hello
System.out.println(newMessage); // Jello
🟠Отсутствие неожиданных изменений (безопасность данных) Если объект неизменяемый, его нельзя случайно изменить.
class BankAccount {
    private final String accountNumber;

    public BankAccount(String accountNumber) {
        this.accountNumber = accountNumber;
    }

    public String getAccountNumber() {
        return accountNumber;
    }
}
🟠Упрощает отладку и поддержку кода Изменяемые объекты могут менять состояние в неожиданный момент.
List<String> list = new ArrayList<>();
list.add("Java");

modifyList(list); // Метод может изменить список!

System.out.println(list); // Ожидаем ["Java"], но может быть что угодно!
🟠Можно использовать в качестве ключей в `HashMap` и `HashSet` Хешкод неизменяемого объекта не изменится, а значит, он корректно работает в HashMap.
Map<String, String> map = new HashMap<>();
map.put("key", "value");

System.out.println(map.get("key")); // Всегда "value", так как String неизменяемый
🟠Совместимость с кэшем (например, в Hibernate, Spring) Неизменяемые объекты можно безопасно кешировать, так как они не меняются. 🚩Как создать неизменяемый класс? Все поля private final. Нет сеттеров. Если есть массивы или списки – копируем их перед возвратом.
final class Person {
    private final String name;
    private final int age;

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
Ставь 👍 и забирай 📚 Базу знаний