Библиотека джависта | Java, Spring, Maven, Hibernate
23.1K subscribers
2.26K photos
47 videos
46 files
3.21K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://xn--r1a.website/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔍 AI код-ревьювер, который понимает весь проект

Нашёл интересный свежий проект Greptile — AI-инструмент для автоматизированного code review.

В отличие от обычных линтеров, Greptile анализирует всю кодовую базу, понимая связи между классами, методами и зависимостями. Это позволяет находить скрытые баги, которые легко пропустить при обычном review.

🔹 Ключевые возможности:

→ Интеграция с GitHub и GitLab — комментарии прямо в PR
→ Контекстный анализ — понимает архитектуру проекта целиком
→ Работает со всеми языками, включая Java
→ Обучается на фидбеке команды — становится умнее со временем
→ Генерирует sequence диаграммы для сложных PR

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2👏1🥱1
📈 Big-O ≠ производительность

Часто выбор коллекции ограничивается только таблицей сложностей и на этом всё.

Но реальный кейс сложнее: средняя сложность ≠ реальная скорость в продакшне. JVM, кэш процессора, GC и паттерны доступа могут радикально поменять картину.

🔑 Главная мысль

Выбирайте коллекцию под сценарий использования, а не “по самой быстрой ячейке в таблице”.

1️⃣ ArrayList — быстр в чтение, но не во вставке

ArrayList хранит элементы в массиве → локальность памяти + CPU кэш → итерации летят.
Вставка в середину за O(n), но при небольших списках разница с LinkedList исчезающе мала.

🔧 Паттерн использования:

— 90% чтение, редкие вставки → идеально.
— Если заранее известно примерное кол-во элементов → задайте initialCapacity, иначе ArrayList будет несколько раз пересоздавать массив (copy O(n) на каждом росте).

📌 Факт:

В бенчмарках JMH даже при вставке в середину ArrayList часто быстрее LinkedList просто потому, что LinkedList платит за “pointer chasing” (скачки по памяти, cache-miss).

2️⃣ LinkedList — звучит круто, но редко нужен

Да, вставка/удаление в начало или конец за O(1).
Но get(i) = O(n), и каждый шаг = новый объект, новая ссылка → нагрузка на GC.

🔧 Паттерн использования:

— Когда нужна двусторонняя очередь с частыми удалениями/добавлениями в начало и конец.
— Во всех остальных случаях лучше ArrayDeque, он без лишних объектов и быстрее почти всегда.

📌 Факт:

LinkedList ест больше памяти: на каждый элемент два указателя + объект-узел.

3️⃣ HashMap / HashSet — быстрые, пока не наступил resize

HashMap даёт O(1) доступ при хорошем hashCode().

Но:
— Если хэши “плохие” → коллизии → O(log n)
— При достижении load factor 0.75 → resize → перераспределение всех бакетов (дорогая операция).

🔧 Паттерн использования:

— Когда нужен быстрый поиск по ключу без сохранения порядка или когда важно хранить уникальные элементы или строить словари/кэши по ключу.
— Если знаете примерное кол-во элементов → сразу задайте кол-во элементов в конструкторе new HashMap<>(N).

📌 Факт:

Начиная с Java 8 при коллизии, когда LinkedList становится длинным (по умолчанию ≥ 8 элементов) → список превращается в красно-чёрное дерево.

4️⃣ TreeMap / TreeSet — порядок стоит денег

Дают O(log n) доступ и всегда хранят ключи отсортированными.
Но если сортировка нужна редко, дешевле собрать HashMap и вызвать sorted() на стриме.

🔧 Паттерн использования:

— Когда важно поддерживать сортировку на каждой операции (напр. Top-N задач в приоритетной очереди).
— Не храните mutable-ключи, т.к. можно “потерять” элемент при изменении поля, участвующего в compareTo.

📌 Факт:

TreeMap хранит узлы с балансировкой (красно-чёрное дерево) → накладные расходы на память + сравнения ключей.

5️⃣ LinkedHashMap — скрытый герой для кэшей

LinkedHashMap поддерживает порядок вставки или порядок доступа (accessOrder=true).
Можно сделать LRU-кэш, переопределив removeEldestEntry.

🔧 Паттерн использования:

— Когда важен порядок, но сортировка не нужна.
— Когда нужно легко реализовать ограниченный кэш.

📌 Факт:

Каждый get() в режиме accessOrder вызывает перестановку в двусвязном списке → небольшие накладные расходы.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍163🔥2👏1
Java в мире AI-агентов: Enterprise-подход к автономности

Пока другие балуются с промптами, мы учимся строить надёжные мультиагентные системы. В 2026 году автономные агенты — это стандарт для автоматизации сложных бизнес-процессов.

На курсе от Proglib Academy ты освоишь:

— паттерн ReAct: как заставить агента рассуждать и действовать;
— интеграцию с n8n для управления рабочими процессами;
— протокол MCP от Anthropic для бесшовного обмена данными;
— продвинутый RAG для мгновенного поиска по корпоративным знаниям.

Результат — дипломный проект в виде автономной группы агентов для анализа данных или техподдержки.

❄️ До 12 января забирай курс по ИИ-агентам по акции «3 в 1» (получи ещё два курса бесплатно).

Прокачать скиллы
2
⚙️ Как работает Garbage Collector

Механизм сборки мусора в JVM — это не просто “магия, которая чистит память”, а сложная система, работающая по поколениям, фазам и стратегиям.

Понимание его внутренней архитектуры важно, если вы хотите управлять производительностью, избегать утечек и эффективно настраивать параметры JVM.

🔹 Архитектура: как устроена куча (Heap)

Куча памяти делится на поколения:
Heap
├── Young Generation
│ ├── Eden Space
│ └── Survivor Spaces (S0, S1)
└── Old Generation (Tenured)


Eden — вновь созданные объекты.
Survivor — те, кто “выжил” после первой сборки.
Old Gen — объекты, пережившие несколько сборок, считаются “долгоживущими”.

Дополнительно есть Metaspace (с Java 8), где хранятся данные о классах.

🔹 Алгоритм работы GC: по фазам

1. Mark

GC начинает с “корневых” ссылок (стек, глобальные переменные) и помечает все достижимые объекты.

2. Sweep
Удаляются все немаркированные объекты — они считаются “мертвыми”.

3. Compact (в некоторых GC)
Уплотнение памяти: “живые” объекты перемещаются ближе друг к другу, чтобы избежать фрагментации.

🔹 Типы сборок

1. Minor GC
Запускается при заполнении Eden. Очищаются только молодые поколения. Быстро, но может происходить часто.

2. Major GC / Full GC
Включает Old Gen и Metaspace. Дорогая операция, может “заморозить” все потоки (stop-the-world pause).

🔹 Типы сборщиков и их принципы

— Serial GC: однопоточная сборка. Просто и медленно.
— Parallel GC: многопоточная сборка всех поколений. Высокая пропускная способность.
— G1 GC: делит кучу на регионы, параллельно собирает “Region Set”. Поддерживает предсказуемые паузы.
— ZGC: целиком конкурентный сборщик. Работает с огромными кучами (до терабайта), паузы <10 мс.
— Shenandoah: минимальные паузы за счёт почти полной конкуренции с пользовательскими потоками.

🔹 Как GC определяет, что объект мёртв?

GC не использует reference count. Он строит граф достижимости:
1. Начинает с “корней” (GC roots)
2. Если оттуда нельзя добраться до объекта — он считается мусором
3. Это позволяет избежать утечек при циклических ссылках

🔹 Советы по оптимизации

— Избегайте долгоживущих ссылок (static, ThreadLocal) без необходимости
— Используйте WeakReference, если хотите избежать удержания объекта GC
— Кэшируйте объекты осознанно — утечка через Map может быть незаметной
— Задавайте лимиты памяти (-Xms512m -Xmx1024m)

💬 Ловили OutOfMemoryError в проде когда-нибудь?

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥42👏2
😮 Топ-вакансий для джавистов за неделю

Java Developer — офис (Москва)

Java Developer (Middle) — 100 000 – 200 000 ₽ — офис (Тольятти)

Java-разработчик — 300 000 —‍ 490 000 ₽ — офис/Гибрид (Москва)

➡️ Еще больше топовых вакансий — в нашем канале Java jobs
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1👏1😁1
👑 Магия IntelliJ IDEA: Ctrl+E

Переключаешься между файлами через Project View? Теряешь время на поиск нужной вкладки среди десятка открытых? Есть способ быстрее.

🔹 Что это

Ctrl+E (Recent Files) — показывает список недавно открытых файлов. Быстрый доступ к тому, с чем ты работал последние 5-10 минут.

🔹 Что умеет

— Показать последние открытые файлы.
— Переключиться на файл по первым буквам названия.
— Видеть структуру директорий для контекста.
— Отметить часто используемые файлы звёздочкой.
— Фильтровать список прямо в окне поиска.

🔹 Зачем это нужно


— Не нужно искать файл в дереве проекта.
— Быстрее, чем кликать по вкладкам.
— Видишь историю своей работы.
— Меньше отвлекаешься от кода.

🎯 Бонус


— Нажми Ctrl+E дважды — увидишь только недавно редактированные файлы.
— Начни печатать — список отфильтруется автоматически.
— Стрелками вверх/вниз быстро переключаешься между последними 2-3 файлами.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥42👏1
Сохраняйте шпаргалку по командам git

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2👏2
💼⌛️ ТОП-5 причин, почему программист не может долго найти работу

Почему некоторые разработчики остаются "между работами" месяцы?

Не всегда дело в нехватке вакансий или «рынок просел». Часто дело в подходе к поиску проекта. Вроде бы есть опыт, стек, даже pet-проекты, но офферов всё нет.

Часто корень проблемы — неумение продать себя правильно. Отказ выполнять тестовые задания, считая их ненужными или обидными. Кроме того, нежелание рассматривать стажировки как стартовую площадку для получения опыта и расширения профессиональных связей также может замедлить процесс трудоустройства. И это далеко не все возможные причины.

🔗 Подробнее в статье

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁3🔥2👏1
Enterprise AI 2026: время автономных Java-агентов

В мире Spring и Hibernate наступает новая эра — эпоха мультиагентных систем. В 2026-м ИИ-агенты становятся частью бизнес-логики крупных корпораций.

Освойте передовой стек на нашем курсе:

— паттерн ReAct: внедрение автономности в сложные системы;
— интеграция с n8n для бесшовной автоматизации процессов;
— протокол MCP: стандарт взаимодействия агентов в Enterprise;
— продвинутый RAG: работа с огромными объёмами корпоративных данных.

Сделайте шаг в сторону ИИ, пока другие только присматриваются.

❄️ До 12 января акция «3 в 1»: курс по ИИ-агентам + 2 курса в подарок.

Изучить программу
Как бы вы оптимизировали запрос с JOIN?

Создание индексы на колонках, которые используются для соединений. Это ускорит поиск строк, особенно если соединяемые таблицы большие.

Если возможно, уменьшить размер данных, участвующих в соединении. Для этого можно использовать подзапросы или фильтровать данные до соединения.

Использование правильного типа JOIN.

EXPLAIN для анализа выполнения запроса и выявления узких мест. Это покажет, как именно СУБД обрабатывает запрос и на каких этапах происходят замедления.

Если запросы с JOIN используются часто, создать материализованные представления для хранения результатов, что снизит нагрузку на базу данных при повторных обращениях.

Рассмотреть варианты изменения структуры БД (например, денормализация).

🐸 Библиотека собеса по Java

#core #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍81🔥1👏1
📈 Как «ленивая разработка» захватывает IT-рынок

Пока мы выстраиваем архитектуру, пишем тесты и спорим о лучших практиках, рынок всё активнее обживают те, кто вообще не пишет код. Low-code и no-code решения не просто живы — они становятся нормой для бизнеса.

Порог входа минимальный, скорость разработки — бешеная, а заказчику всё равно, написано ли это на Java или накликано в визуальном редакторе. Вопрос: как долго останется актуальной классическая разработка?

🔗 Подробнее в статье

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
😁11🥱3👍1🔥1🤔1
Как найти длину самой длинной строки в списке?
Anonymous Quiz
10%
list.stream().filter(s -> s.length() > max).count();
65%
list.stream().mapToInt(String::length).max().orElse(0);
16%
list.stream().map(String::length).max((a, b) -> b - a).orElse(0);
3%
list.stream().mapToInt(String::length).sum();
7%
Посмотреть ответ
👍10🔥2👏2
⚡️ Параллельные стримы: ускорение или нет?

Java предоставляет мощный инструмент для обработки данных — параллельные стримы. Они позволяют автоматически распределять вычисления по нескольким потокам, но их эффективность зависит от множества факторов.

Добавление parallelStream() бездумно — это не "оптимизация", а лотерея с шансом на баги и падение.

Когда не использовать

— При небольшом наборе данных (<10 000 элементов) затраты на управление потоками могут превышать прирост скорости.
— Операции sorted(), distinct() или limit() требуют полного знания данных, что снижает эффективность параллельного выполнения.
— Вложенные parallelStream() в CompletableFuture или ExecutorService могут привести к конкуренции за ресурсы и неожиданному падению производительности.

✔️ Когда использовать

— Обработка больших объёмов данных (100 000+ элементов).
— Операции независимы и ресурсоёмки, например, сложные вычисления, парсинг файлов, загрузка данных из сети.

🔍 Важная особенность

parallelStream() использует ForkJoinPool.commonPool(). Если есть другие задачи, использующие этот же пул, они могут начать конкурировать за потоки, замедляя всё приложение.

💬 Делитесь в комментах интересными кейсами

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava #лучшее2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥21👏1
👑 Магия IntelliJ IDEA: покрытие тестами

Запускаешь тесты, они зелёные, и ты думаешь всё ок? А потом баг на проде в ветке, которую никто не проверил. IDEA умеет показывать, что реально покрыто тестами.

🔹 Что это

Run with Coverage — запуск тестов с визуализацией покрытия кода. Видишь прямо в редакторе, какие строки покрыты тестами, а какие нет.

🔹 Как запустить

— Ctrl+Shift+F10 → выбрать "Run with Coverage".
— Или правой кнопкой на тест/класс → "More Run/Debug" → "Run with Coverage".
— Или через иконку щита рядом с кнопкой Run.

🔹 Что показывает

→ Зелёная полоска слева от кода — строка выполнилась.
→ Красная полоска — строка не покрыта тестами.
→ Жёлтая полоска — ветка покрыта частично (if выполнился, else — нет).
→ Окно Coverage — статистика по классам, пакетам, методам.

🔹 Фишки

→ Кликни на класс в Coverage window → увидишь его code coverage.
→ Кликни на жёлтую полоску → IDEA покажет, какая именно ветка не покрыта.
→ Сортируй классы по проценту покрытия — найдёшь слабые места.
→ Экспортируй отчёт (HTML) через кнопку в Coverage панели.

🔹 Зачем это нужно


— Находишь непокрытые edge cases.
— Видишь, что тест не проверяет все ветки if/else.
— Не гадаешь, а точно знаешь, что покрыто.
— Быстро понимаешь, где добавить тесты.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥4👏1