uz
Feedback

Firibgarlarga uchmang! Telemetrio bunday kanallarni topadi va belgilaydi 👉 Belgini ko‘rmoqchi bo‘lsangiz, obuna bo‘ling

Java библиотека

Java библиотека

Kanalga Telegram’da o‘tish

Java коротко и по делу ☕️ Разборы кода, книги, статьи и задачи с собеседований. Реклама: @NadikaKir РКН: https://vk.cc/cJrT4A Биржа: https://telega.in/c/javalib/ ВК: https://vk.com/javatutorial

Ko'proq ko'rsatish

📈 Telegram kanali Java библиотека analitikasi

Java библиотека (@javalib) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 30 393 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 4 370-o'rinni va Rossiya mintaqasida 21 069-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 30 393 obunachiga ega bo‘ldi.

01 Noyabr, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -220 ga, so‘nggi 24 soatda esa -19 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 6.30% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 4.38% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 1 914 marta ko‘riladi; birinchi sutkada odatda 1 330 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 5 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent string, мониторинг, строка, boot, архитектура kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
“Java коротко и по делу ☕️ Разборы кода, книги, статьи и задачи с собеседований. Реклама: @NadikaKir РКН: https://vk.cc/cJrT4A Биржа: https://telega.in/c/javalib/ ВК: https://vk.com/javatutorial”

Yuqori yangilanish chastotasi (oxirgi ma’lumot 02 Noyabr, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

30 393
Obunachilar
-1924 soatlar
-1207 kun
-22030 kun
Postlar arxiv
📊 Buildpack задаёт базовую ОС и состав окружения Java-контейнера Buildpack собирает образ из исходников без собственного Doc
📊 Buildpack задаёт базовую ОС и состав окружения Java-контейнера Buildpack собирает образ из исходников без собственного Dockerfile. При этом выбранный builder определяет окружение сборки, а run image — основу контейнера, в котором будет работать приложение. В сравнении реализаций buildpack собраны Paketo, Heroku, Google и другие варианты. Они различаются базовой ОС, поддержкой JVM и Native Image, доступными системными библиотеками и условиями сопровождения. Перед выбором проверьте нативные зависимости приложения, сертификаты и архитектуру процессора. Затем соберите один и тот же сервис двумя подходящими вариантами и сравните размер образа, результаты сканирования и запуск в своём окружении. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

5 курсов бесплатно. Чёрная пятница в Яндекс Практикуме Бюджет на развитие команды не растёт, а задач всё больше? Сэкономьте 9
5 курсов бесплатно. Чёрная пятница в Яндекс Практикуме Бюджет на развитие команды не растёт, а задач всё больше? Сэкономьте 90 000 ₽ и получите бесплатно набор курсов, которые помогут в работе с ИИ и людьми. Чтобы забрать бонус, оплатите обучение в Практикуме для себя или сотрудников до 30 ноября. Что вас ждёт в наборе: ✅ «Базовые навыки по работе с ИИ». Получите основу для внедрения ИИ в задачи. ✅ «Управление ИИ-агентами». Автоматизируете повторяющуюся рутину. ✅ «Настройка процессов и эффективность команды». Узнаете, как влиять на результаты и мотивацию. ✅ «Навыки рабочей коммуникации». Будете увереннее проводить встречи. ✅ «Сложные переговоры». Научитесь управлять эмоциями и разрешать конфликты. Узнать больше #реклама 16+ practicum.yandex.ru О рекламодателе

Утечка памяти, фрагментация и нагрузка на GC: в чём разница? Приложение потребляет много памяти — это ещё не означает утечку.
Утечка памяти, фрагментация и нагрузка на GC: в чём разница? Приложение потребляет много памяти — это ещё не означает утечку. Причины могут быть разными. Memory Leak — ненужные объекты остаются достижимыми. Программа больше не использует их, но продолжает хранить ссылки, поэтому сборщик мусора не может освободить память. Типичные причины: кэш без ограничений, растущие статические коллекции, неудалённые слушатели и неправильная работа с ThreadLocal. Один из признаков — устойчивый рост занятой памяти даже после сборок мусора. Memory Fragmentation — свободная память есть, но она разбита на неудобные участки. Например, суммарно места достаточно, но нет подходящего непрерывного блока для выделения. В Java влияние фрагментации зависит от сборщика мусора и области памяти: heap, native или off-heap. Многие сборщики перемещают объекты и уплотняют память, но это не устраняет все возможные случаи. GC Pressure — объекты создаются быстрее, чем системе удобно их убирать. Память освобождается, однако GC приходится работать часто или интенсивно, расходуя CPU и увеличивая задержки. Причины: высокая скорость выделения памяти, множество временных объектов, большие промежуточные структуры и частая сериализация. При диагностике смотрите на разные сигналы: • Утечка: какие объекты остаются живыми и что удерживает ссылки на них. • Фрагментация: в какой области памяти не удаётся выделить нужный блок. • GC Pressure: скорость аллокаций, частоту сборок, паузы и затраты CPU. Увеличение -Xmx иногда помогает, но при утечке лишь откладывает проблему. Сначала выясните, почему память растёт и на что тратится время GC. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

🛠 JDK 28 сможет выделять небольшие блоки нативной памяти из повторно используемых пулов Вызову нативной функции нужен указат
🛠 JDK 28 сможет выделять небольшие блоки нативной памяти из повторно используемых пулов Вызову нативной функции нужен указатель на одно число. Создавать полноценное выделение памяти ради нескольких байт может оказаться дороже самой работы с ними. Типичный код FFM выглядит так:
try (Arena arena = Arena.ofConfined()) {
    MemorySegment segment =
        arena.allocate(ValueLayout.JAVA_INT);

    segment.set(ValueLayout.JAVA_INT, 0, 42);
}
В разрабатываемом JDK 28 небольшие выделения confined-арены могут обслуживаться из пула. Он запрашивается лениво, при первом подходящем выделении. По умолчанию кеш платформенного потока может хранить четыре пула по 64 байта. Если размер или выравнивание не подходят, используется обычный путь. 🟡 Закрытая арена не становится доступной повторно После close() её сегменты всё так же недоступны. Перед повторным использованием занятая часть пула очищается. Повторно используется внутренняя память, а не старые MemorySegment. Менять исходный код ради этой оптимизации не требуется. Но это улучшение будущего JDK 28: пример API уже знаком по выпущенным версиям, описанный механизм пулов — ещё нет. 🔗 Как устроены пулы confined-арен ══════ Навигация ══════ Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Spring Boot + Kafka: отправка и получение событий с минимумом кода Внедрите KafkaTemplate, чтобы отправлять сообщения в топик
Spring Boot + Kafka: отправка и получение событий с минимумом кода Внедрите KafkaTemplate, чтобы отправлять сообщения в топик. Добавьте @KafkaListener к методу, чтобы обрабатывать входящие сообщения. Автоконфигурация Spring Boot настроит компоненты Kafka по параметрам spring.kafka.*. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Не нашли готовое ИИ-решение для своей компании? Скорее всего, его и не существует. Мы Джи-спарк создаём корпоративные ИИ-сист
Не нашли готовое ИИ-решение для своей компании? Скорее всего, его и не существует. Мы Джи-спарк создаём корпоративные ИИ-системы под процессы конкретного бизнеса. Не продаём коробочные сервисы. Не предлагаем типовых ботов. Если задача нестандартная, мы проектируем решение с нуля для: • Производства • Логистики • Строительства • Банков • Ритейла • B2B-компаний Интегрируем ИИ в существующие процессы компании без их перестройки. Именно поэтому к нам обращаются, когда готовые сервисы уже не подходят. Если вы рассматриваете ИИ как инвестицию в развитие бизнеса, а не как эксперимент давайте обсудим вашу задачу. 📞 Бесплатная консультация Узнать больше #реклама 16+ g-spark.ru О рекламодателе

☕️ JDK 27 копирует HashMap без повторного вычисления хешей в специальных сценариях Копирование Map выглядит коротко: var copy
☕️ JDK 27 копирует HashMap без повторного вычисления хешей в специальных сценариях Копирование Map выглядит коротко:
var copy = new HashMap<>(source);
Но внутри общего пути могут быть итератор, обращения к ключам и значениям, повторный hashCode(). Когда через одну точку вызова проходят разные реализации Map, JIT сложнее убрать эти расходы. В JDK 27 добавили специальные пути для источника, который является именно HashMap, и неизменяемой обёртки над HashMap. Они обходят исходную таблицу напрямую и используют хеши, уже сохранённые в её узлах. Оптимизация относится и к putAll(). Для других реализаций Map остаётся общий путь. 🟡 Это не глубокое копирование Новая таблица по-прежнему содержит ссылки на те же ключи и значения. Изменяемый объект внутри карты не станет независимым после создания копии. В статье приведены заметные выигрыши микробенчмарков на конкретной платформе. Переносить эти проценты на весь сервис нельзя: сначала проверьте, есть ли копирование карт среди его горячих участков. 🔗 Что ускорили в библиотеках JDK 27 Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

🛠 Spring переводит регулярные исправления на единый день выпуска Раньше обновления проектов Spring выходили по очереди в теч
🛠 Spring переводит регулярные исправления на единый день выпуска Раньше обновления проектов Spring выходили по очереди в течение двух недель. Теперь команда собирает их в один выпуск: в четверг после третьего понедельника месяца. Первый регулярный выпуск по новой схеме назначен на 22 октября. Это дата из анонса — наличие конкретных версий в Maven Central всё равно нужно проверять. Причина изменения практическая: при растянутом графике исправления уязвимостей появлялись в разные дни. Единый выпуск позволяет получить согласованный набор обновлений сразу. 🟡 Что проверить в своём проекте — Какая версия Spring Boot и какой BOM управляют зависимостями. — Какие рекомендации по безопасности относятся к используемым компонентам. — Какие тесты нужно прогнать перед обновлением. На spring.io/security появились фильтры по проекту, серьёзности и номеру CVE. Это удобнее, чем искать нужный компонент в длинной ленте. Общий день выпуска не означает, что можно обновить только одну случайную библиотеку и считать весь стек исправленным. Сначала проверьте рекомендации для затронутых проектов и совместимость версий. 🔗 Как меняется выпуск обновлений Spring Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

👩‍💻 Как Java-баги ломают Minecraft-мод В статье разбирают ошибки в Create — одном из популярных модов для Minecraft. Есть п
👩‍💻 Как Java-баги ломают Minecraft-мод В статье разбирают ошибки в Create — одном из популярных модов для Minecraft. Есть проблемы с неизменяемыми строками, null, мёртвым кодом и обработкой исключений. Причём автор не просто показывает предупреждения анализатора, а проверяет, как баги ведут себя прямо в игре. ⛓ Читать статью Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Сверяем файлы сборки и находим расхождения! После копирования приложения можно проверить, что файлы совпадают с исходной сбор
Сверяем файлы сборки и находим расхождения! После копирования приложения можно проверить, что файлы совпадают с исходной сборкой. Напишем небольшую проверку двух каталогов, которая найдёт отсутствующие и изменённые файлы, не загружая их целиком в память. Обойдём файлы без загрузки всего списка в память и закроем поток после проверки. Символические ссылки отфильтруем через LinkOption.NOFOLLOW_LINKS:
try (Stream<Path> files = Files.walk(buildDir)) {
    Iterator<Path> paths = files.filter(path ->
        Files.isRegularFile(path, NOFOLLOW_LINKS)).iterator();
    while (paths.hasNext()) compare(paths.next(), buildDir, deployDir);
}
Для каждого файла строим такой же относительный путь в каталоге развёртывания. Это сохраняет структуру вложенных папок:
Path relative = buildDir.relativize(source);
Path deployed = deployDir.resolve(relative);
Отсутствующий файл отмечаем отдельно, иначе проверка совпадения не сможет отличить его от пустого файла:
if (!Files.isRegularFile(deployed)) {
    reportMissing(relative);
    return;
}
Для существующих файлов используем Files.mismatch. Метод читает содержимое по мере необходимости и возвращает позицию первого различия, а -1 означает полное совпадение:
long offset = Files.mismatch(source, deployed);
if (offset == -1) reportMatch(relative);
else reportDifference(relative, offset);
Можно добавить обратный проход по каталогу развёртывания, если нужно также находить лишние файлы. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Java Records — больше, чем сокращённая запись класса record User(String name, String email) {} Вы получаете: → Поля компонент
Java Records — больше, чем сокращённая запись класса
record User(String name, String email) {}
Вы получаете: → Поля компонентов с модификатором final. → Автоматические equals(), hashCode() и toString(). → Явный сигнал: «этот тип хранит данные». Используйте records для DTO — меньше шаблонного кода, проще ревью. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Java Records, Lombok и POJO: в чём разница? Все три подхода помогают описывать данные, но отвечают на разные потребности: кра
Java Records, Lombok и POJO: в чём разница? Все три подхода помогают описывать данные, но отвечают на разные потребности: краткость, генерация шаблонного кода и контроль над поведением класса. • Record — компактный носитель данных. Records стали стандартной возможностью языка в Java 16:
public record User(
    Long id,
    String name,
    String email
) {}
Компилятор создаёт конструктор для всех компонентов, методы доступа id(), name(), email(), а также equals(), hashCode() и toString(). Подходит для DTO, моделей запросов и ответов API, данных событий. Неизменяемость поверхностная: поля компонентов — final, но содержимое переданного списка или другого изменяемого объекта всё ещё может меняться. • Lombok — меньше шаблонного кода. Аннотации позволяют генерировать методы и конструкторы при компиляции:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Long id;
    private String name;
    private String email;
}
Lombok умеет создавать getters/setters, конструкторы, equals(), hashCode(), toString() и builder через @Builder. Удобен для существующих проектов и классов с большим количеством повторяющегося кода. При этом добавляет зависимость при сборке и требует понимания того, что именно генерируется. С JPA-сущностями аннотации стоит выбирать аккуратно: автоматически созданные equals(), hashCode() и toString() могут некорректно работать со связями и ленивой загрузкой. • POJO — обычный Java-объект. Класс без обязательной привязки к специальному фреймворку или модели программирования. Вы сами определяете конструкторы, валидацию, изменяемость, бизнес-логику и правила сравнения. Подходит для доменных моделей и классов с нестандартным поведением. Это не три взаимоисключающих варианта: record — возможность языка, Lombok — инструмент генерации кода, POJO — характеристика класса. Класс с аннотациями Lombok вполне может оставаться POJO. Выбирайте подход по назначению класса, а не только по количеству сэкономленных строк. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Как кешировать данные о классах и не удерживать ClassLoader? Фреймворки часто читают аннотации и методы через reflection. Сох
Как кешировать данные о классах и не удерживать ClassLoader? Фреймворки часто читают аннотации и методы через reflection. Сохранять такие данные в обычной статической map не всегда безопасно, если приложение выгружает плагины или модули. Например, типичный кеш хранит ссылку на класс в ключе:
Map<Class<?>, Metadata> cache = new ConcurrentHashMap<>();
Заполнять такой кеш можно через computeIfAbsent:
cache.computeIfAbsent(type, MetadataCache::inspect);
Но долгоживущий кеш удерживает ключи-Class, а вместе с ними может задержать выгрузку ClassLoader. Для данных, привязанных к Class, в Java есть ClassValue. Опиши вычисление один раз в computeValue:
ClassValue<Metadata> cache = new ClassValue<>() {
    protected Metadata computeValue(Class<?> type) {
        return inspect(type);
    }
};
Значение вычисляется по запросу, отдельно для каждого класса. Оставляй inspect без побочных эффектов, поскольку конкурентные вызовы могут привести к повторному вычислению. Читай метаданные через get:
Metadata metadata = cache.get(Order.class);
metadata.invoke(order);
Такой доступ не требует вручную синхронизировать создание значения. ClassValue подходит для reflection-кеша, который индексируется объектами Class. Если значение нужно пересчитать, удали его:
cache.remove(Order.class);
Metadata refreshed = cache.get(Order.class);
Следующий get снова вызовет computeValue. Для обычных кешей с произвольными ключами ClassValue не подходит. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Что такое тернарный оператор выбора? Тернарный условный оператор ?: - оператор, которым можно заменить некоторые конструкции
Что такое тернарный оператор выбора? Тернарный условный оператор ?: - оператор, которым можно заменить некоторые конструкции операторов if-then-else. Выражение записывается в следующей форме: условие ? выражение1 : выражение2 Если условие выполняется, то вычисляется выражение1 и его результат становится результатом выполнения всего оператора. Если же условие равно false, то вычисляется выражение2 и его значение становится результатом работы оператора. Оба операнда выражение1 и выражение2 должны возвращать значение одинакового (или совместимого) типа. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Java 21: виртуальные потоки для задач с ожиданием I/O JVM управляет множеством лёгких потоков без отдельного потока ОС для ка
Java 21: виртуальные потоки для задач с ожиданием I/O JVM управляет множеством лёгких потоков без отдельного потока ОС для каждого. Можно сохранить привычный блокирующий код и обрабатывать много задач одновременно. Подходят для многочисленных HTTP-запросов и обращений к БД, где значительная часть времени уходит на ожидание. Вычисления на CPU сами по себе быстрее не станут. И не забывайте ограничивать параллельные обращения: виртуальные потоки не увеличивают пропускную способность базы или внешнего API. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Какие весовые рамки у integer? В Java тип int занимает 4 байта (32 бита) и имеет диапазон: -2^{31} \text{ до } 2^{31} - 1 Точ
Какие весовые рамки у integer? В Java тип int занимает 4 байта (32 бита) и имеет диапазон: -2^{31} \text{ до } 2^{31} - 1 Точный диапазон `int` Минимальное значение Integer.MIN_VALUE = -2,147,483,648 Максимальное значение Integer.MAX_VALUE = 2,147,483,647
public class Main {
    public static void main(String[] args) {
        System.out.println("Минимальный int: " + Integer.MIN_VALUE);
        System.out.println("Максимальный int: " + Integer.MAX_VALUE);
    }
}
Вывод:
Минимальный int: -2147483648  
Максимальный int: 2147483647  
Почему именно такой диапазон? 4 байта (32 бита) означают, что у нас 2³² возможных значений. Поскольку int знаковый (поддерживает отрицательные и положительные числа), половина значений отводится подотрицательные числа. Один бит используется для знака (0 – положительное число, 1 – отрицательное). \text{Диапазон} = - (2^{31}) \text{ до } (2^{31} - 1) Что будет, если выйти за пределы `int`? Если сложить два максимальных значения int, произойдёт переполнение (overflow)
int a = Integer.MAX_VALUE;
int b = 1;
int c = a + b;
System.out.println(c);  // Выведет -2147483648 (переполнение!)
Как работать с числами больше `int`? Использовать `long` (8 байт, диапазон от -2^63 до 2^63 - 1):
long bigNumber = 2_147_483_648L;  // Обязательно добавлять "L" в конце
Использовать BigInteger (неограниченный размер):
BigInteger bigNum = new BigInteger("999999999999999999999999");
Ставь и забирай Базу знаний Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Проверяем пересечение бронирований на Java! В календаре нужно отклонить новую бронь, если выбранное время уже занято. Для про
Проверяем пересечение бронирований на Java! В календаре нужно отклонить новую бронь, если выбранное время уже занято. Для проверки достаточно сравнить начало и конец двух интервалов, не перебирая каждую минуту внутри них. Сделаем модель с полуоткрытым интервалом, где начало включается, а конец уже свободен:
record Booking(LocalDateTime start, LocalDateTime end) {
    Booking {
        if (!start.isBefore(end)) {
            throw new IllegalArgumentException("End must be after start");
        }
    }

boolean overlaps(Booking other) {
        return start.isBefore(other.end())
            && other.start().isBefore(end);
    }
}
Проверка не даст создать бронь нулевой или отрицательной длины. Условие пересечения учитывает обе границы и не считает соседние интервалы конфликтом. Подготовим уже занятые промежутки и новый запрос:
List<Booking> existing = List.of(
    new Booking(start1, end1),
    new Booking(start2, end2)
);
Booking requested = new Booking(requestStart, requestEnd);
Здесь предполагается, что все значения уже приведены к одной временной зоне. Для расписания в нескольких регионах лучше сравнивать Instant, а исходный ZoneId сохранять отдельно. Проверим весь список и получим понятный результат:
boolean conflict = existing.stream()
    .anyMatch(booking -> booking.overlaps(requested));
anyMatch завершает проверку, как только найдёт первое пересечение. Если conflict равен false, новую бронь можно добавить, а интервалы, которые соприкасаются ровно по границе, останутся допустимыми. Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

Сохрани, сессия скоро ИИ, который реально помогает с учёбой, а не выдумывает источники 📊 Объяснит тему, соберёт план и презу, подберёт литературу. 400 токенов дарят просто за регистрацию. Дальше 399 ₽/мес, дешевле рафа. Попробовать #реклама 16+ kampus.ai О рекламодателе

☕️ Скользящие окна в Stream без ручного буфера Нужно сравнить соседние измерения или обработать последовательность небольшими
☕️ Скользящие окна в Stream без ручного буфера Нужно сравнить соседние измерения или обработать последовательность небольшими перекрывающимися группами? В Java 24+ есть готовый gatherer.
var windows = Stream.of(1, 2, 3, 4, 5)
    .gather(Gatherers.windowSliding(3))
    .toList();

// [[1, 2, 3], [2, 3, 4], [3, 4, 5]]
Каждое следующее окно теряет самый старый элемент и получает новый. Если вход короче размера окна, получится одно неполное окно; пустой Stream не выдаст ни одного. 🟡 Окна нельзя изменять. Большой размер окна может потреблять лишнюю память — это не бесплатная замена любого буфера. Gatherers стали стабильным API в Java 24. В докладе автора API есть примеры собственных преобразований и правила работы с параллельными потоками. 🔗 Источник • Разбор и примеры Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪

final, finally и finalize: разные задачи final запрещает повторное присваивание переменной, переопределение метода или наслед
final, finally и finalize: разные задачи final запрещает повторное присваивание переменной, переопределение метода или наследование класса. final-ссылка не делает объект неизменяемым:
final var names = new ArrayList<String>();
names.add("Java"); // допустимо
finally выполняется при выходе из try, в том числе после return или исключения. Это не гарантия на случай аварийного завершения JVM. Для AutoCloseable обычно удобнее try-with-resources. finalize() — устаревший механизм финализации. В Java 18 его пометили для удаления, а не удалили: метод ещё присутствует в API Java 25. Момент вызова не гарантирован, поэтому закрывать файлы и соединения через него нельзя. #Java Полезные ресурсы по Java 👩‍💻| Наш канал в MAX 🟪