Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
ℹ️ Как устроен под капотом LinkedHashSet?

LinkedHashSet — это коллекция, обеспечивающая хранение уникальных элементов с сохранением порядка их вставки. LinkedHashSet, как и HashSet, работает с элементами за амортизированное O(1) время, но, в отличие от HashSet, сохраняет порядок добавления элементов благодаря дополнительной структуре связного списка.

🔹 Структура LinkedHashSet

LinkedHashSet базируется на HashMap, но имеет уникальную особенность — упорядочивание элементов за счёт использования связного списка поверх стандартной хеш-таблицы.

▪️ Хранение данных: LinkedHashSet использует LinkedHashMap для хранения элементов. Каждый добавляемый элемент выступает в роли ключа, а значение всегда фиксировано (обычно это объект-заглушка).
▪️ Связный список: Для поддержания порядка добавления, элементы связаны друг с другом в виде двусвязного списка. Это позволяет итерациям проходить элементы в порядке их вставки.
▪️ Уникальность элементов: Как и в HashSet, каждый элемент уникален. При попытке добавить дублирующий элемент он игнорируется, сохраняя уникальность всех значений.

🔹 Производительность

▪️ Добавление: Добавление элементов происходит за амортизированное O(1) время. LinkedHashSet вычисляет хэш элемента и индекс, где он будет храниться в массиве бакетов LinkedHashMap.
▪️ Удаление: Удаление происходит также за амортизированное O(1) время. LinkedHashSet находит элемент по хэшу, удаляет его из связного списка и освобождает место в корзине.
▪️ Поиск: Поиск происходит за амортизированное O(1) время благодаря хэш-таблице.

🔹 Использование памяти

LinkedHashSet требует немного больше памяти по сравнению с HashSet, так как хранит не только хэш-таблицу, но и двусвязный список, поддерживающий порядок добавления элементов. Это делает LinkedHashSet более затратным в плане памяти, особенно при большом количестве элементов.

🔹 Преимущества и недостатки

▪️ Преимущества:
- Сохранение порядка добавления элементов.
- Быстрая работа с элементами за амортизированное O(1) время, как и в HashSet.

▪️ Недостатки:
- Потребление ресурсов возрастает при большом количестве элементов, так как структура требует больше памяти для поддержания порядка.
Please open Telegram to view this post
VIEW IN TELEGRAM
Как думаете, как часто следует менять работу?

⚡️ — раз в год
🔥 — раз в 2-3 года
❤️ — раз в 5-6 лет
🌚 — работу можно менять?
Please open Telegram to view this post
VIEW IN TELEGRAM
🎨 Новый канал для вдохновения — UX in GIF

Мы запустили свежий канал, где делимся идеями для дизайна интерфейсов. Всё самое стильное, оригинальное и вдохновляющее теперь в одном месте.

📌 Чем полезен канал?

→ Идеи для дизайна интерфейсов.
→ Анимации, которые можно повторить или адаптировать.
→ Лёгкий способ искать вдохновение перед новым проектом.

👉 Подписывайтесь и вдохновляйтесь: UX in GIF
Please open Telegram to view this post
VIEW IN TELEGRAM
👔 Слишком молодой, слишком опытный: 9 причин, почему вам могут отказать после собеседования

Собеседование прошло гладко: вы подготовились, уверенно ответили на все вопросы, проявили заинтересованность и даже получили положительный фидбек. Но вместо долгожданного оффера — отказ. Почему так произошло? На самом деле, отказ может быть вызван множеством причин: от излишнего опыта до неудачной коммуникации с рекрутером.

В этой статье разобрали 9 наиболее распространённых причин, по которым кандидаты не получают работу после интервью. Это не всегда связано с вашими навыками — иногда проблема в ожиданиях компании или внутренних процессах. Узнайте, как избежать подобных ситуаций и повысить свои шансы на успех!

📎 Разобраться в причинах
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 IntelliJ IDEA 2024.3

JetBrains выпустили новую версию IntelliJ IDEA 2024.3, и она порадовала рядом полезных фич. Вот самые интересные моменты релиза:

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

🔵 Интеграция AI-ассистента
Новый AI-помощник теперь обладает улучшенной контекстной осведомленностью и может помогать при работе с VCS и отладкой кода. Это ускоряет процесс написания и анализа кода благодаря интеллектуальным подсказкам и оптимизациям.

🔵 Улучшенный дебаггер и HotSwap
Отладка стала еще мощнее: улучшенная функция HotSwap позволяет быстрее обновлять код во время отладки.

🔵 Поддержка Kotlin и GraalVM
Улучшена поддержка новых возможностей Kotlin, а также дебаггинг нативных изображений GraalVM, что упрощает работу с мультиплатформенными приложениями.

Это лишь краткий обзор интересных новинок. Ознакомиться со всеми подробностями релиза можно в официальном блоге JetBrains​.
Please open Telegram to view this post
VIEW IN TELEGRAM
ℹ️ Что такое BeanPostProcessor в Spring?

BeanPostProcessor — это интерфейс из Spring Framework, который позволяет вмешиваться в процесс создания и инициализации бинов в Spring контейнере. Он предоставляет два основных метода, которые вызываются на разных этапах жизненного цикла бина:

▪️ postProcessBeforeInitialization(Object bean, String beanName) - вызывается до того, как бин будет инициализирован (до вызова метода @PostConstruct или InitializingBean#afterPropertiesSet).
▪️ postProcessAfterInitialization(Object bean, String beanName) - вызывается после инициализации бина (после завершения всех инициализационных методов).

Зачем нужен BeanPostProcessor?

Он используется для дополнительной обработки и кастомизации бинов после их создания, но до передачи клиентскому коду. Примеры:

- Добавление проксирования бинов (например, для AOP или транзакций).
- Валидация или изменение свойств бинов.
- Логирование жизненного цикла.
- Добавление кастомных аннотаций.
- Обработка маркерных интерфейсов.

Как это работает?

1️⃣ Spring сканирует контекст на наличие бинов, реализующих интерфейс BeanPostProcessor.
2️⃣ Если такие бины найдены, они применяются ко всем бинам в приложении.
3️⃣ Методы postProcessBeforeInitialization и postProcessAfterInitialization вызываются для каждого бина, который создаёт Spring.

@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("Before Initialization: " + beanName);
return bean;
}

@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("After Initialization: " + beanName);
return bean;
}
}

Результат: Вывод сообщений о каждом бине до и после инициализации.
Please open Telegram to view this post
VIEW IN TELEGRAM
#дайджест #Javadevjob

Вакансии Java разработчиков уровня Junior

▪️ Java developer
Гибрид (Москва, Санкт-Петербург, Екатеринбург), beeline
Подробнее

▪️ Junior Java-разработчик
Офис (Москва), Gridnine
Подробнее

Вакансии Java разработчиков уровня Middle

▪️ Java разработчик
Удалёнка, Comitas
Подробнее

▪️ Middle Java разработчик
Гибрид (Москва, Краснодар, Санкт-Петербург, Иннополис) / Удалёнка (РФ), Магнит
Подробнее

Вакансии Java разработчиков уровня Senior

▪️ Senior Java developer
Офис (Москва, Липецк), НЛМК ИТ
Подробнее

▪️ Senior Java разработчик
Удалёнка, МегаФон
Подробнее

Понравились вакансии?
❤️ — да
🤔 — нет
ℹ️ Что такое BeanFactoryPostProcessor в Spring?

BeanFactoryPostProcessor — это интерфейс из Spring Framework, который позволяет вмешиваться в процесс создания бинов в BeanFactory до их инициализации, но после того, как Spring их создал. Он предоставляет один основной метод:

▪️ postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) — вызывается до инициализации бинов. В этом методе можно изменять конфигурацию бинов, например, добавлять или изменять их свойства, влиять на их типы или даже на порядок их создания.

Зачем нужен BeanFactoryPostProcessor?

Он используется для того, чтобы дать возможность кастомизировать настройки Spring контейнера, не вмешиваясь в сам процесс создания объектов. Примеры:

- Изменение параметров конфигурации бинов, которые уже были определены в контексте.
- Использование кастомных значений или свойств для бинов до их создания.
- Управление зависимостями на уровне контейнера.
- Добавление пользовательских конфигураций, таких как создание собственных PropertyEditors или манипуляции с BeanDefinition.

Как это работает?

1️⃣ Spring сканирует контекст на наличие бинов, реализующих интерфейс BeanFactoryPostProcessor.
2️⃣ Эти бины выполняются до создания бинов в контейнере, и вы можете изменить BeanDefinition в контейнере.
3️⃣ Вы можете, например, изменять параметры и настройки бинов, задавать или корректировать их зависимости, которые будут использованы при создании бинов Spring.

Пример реализации:

@Component
public class CustomBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// Пример изменения beanDefinition
BeanDefinition beanDefinition = beanFactory.getBeanDefinition("someBean");
beanDefinition.getPropertyValues().add("someProperty", "newValue");
}
}

В этом примере изменяются настройки существующего бина до его создания, что позволяет управлять его поведением в контейнере.
Please open Telegram to view this post
VIEW IN TELEGRAM
Сколько объектов станут доступны для сборщика мусора после удаления ссылки на сет?
Anonymous Quiz
15%
0
18%
1
12%
2
17%
3
39%
4
Какой инструмент для работы с БД вы чаще используете?

🔥 Spring Data JPA
👍🏼 Hibernate
⚡️ JDBC
❤️ MyBatis
👾 JOOQ

💬 Пишите в комментарии, про какой инструмент было бы интересно почитать на канале
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Как работает ConcurrentSkipListMap под капотом?

ConcurrentSkipListMap — это потокобезопасная и отсортированная реализация интерфейса NavigableMap, которая работает на основе skip list (списка с пропусками). Skip list — это многослойная структура данных, состоящая из нескольких уровней связных списков: нижний уровень содержит все элементы в порядке сортировки, а верхние уровни — лишь часть элементов для ускорения поиска. При добавлении элемента случайно выбирается его "высота" (количество уровней, на которых он присутствует), что позволяет "перепрыгивать" через блоки данных на верхних уровнях и выполнять операции со сложностью O(log n).

Пример структуры:
lvl 3: 1 ------ 8
lvl 2: 1 --- 7 -- 8
lvl 1: 1 - 3 - 7 - 8 - 10


💡 Основные механизмы:

🔹 Skip List: Многослойный список с пропусками, где верхние уровни помогают быстро достигать нужного диапазона элементов, снижая количество переходов по связям.
🔹 Потокобезопасность обеспечивается за счёт использования CAS (Compare-And-Swap) операций и минимального блокирования. Модификации происходят безопасно без полной блокировки структуры.
🔹 Элементы всегда хранятся в отсортированном порядке по их ключам, что позволяет выполнять операции вроде поиска диапазонов или итераций по упорядоченным ключам очень эффективно.
🔹 Высокая доступность: чтение не блокируется, даже если выполняются параллельные операции вставки или удаления.

⚠️ Особенности:

▪️ Операции чтения (например, get или containsKey) выполняются быстро и без блокировок благодаря структуре skip list.
▪️ Операции записи (например, put и remove) синхронизированы, но производительность сохраняется за счёт оптимизации с использованием CAS.
▪️ Поддерживает натуральный порядок ключей или порядок, определённый переданным компаратором.
▪️ Эффективен для сценариев, где важны отсортированные данные и параллельный доступ, но количество обновлений не слишком велико.

🚀 Когда использовать ConcurrentSkipListMap?

- Если нужен параллельный доступ к отсортированной мапе.
- Для обработки диапазонов данных или частых операций чтения в упорядоченном виде.

🔗 Документация
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Вакансии «Библиотеки программиста» — ждем вас в команде!

Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
👉Переводчик и автор оригинальных статей

Подробности тут

Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴

Ждем ваших откликов 👾
🌐 Как работает GraphQL и чем он лучше RESTful API

GraphQL не следует путать с SQL — он не используется для прямых запросов к таблицам базы данных. GraphQL — это, скорее, формат или структура, которая задаёт контракт между клиентом и сервером API. Его можно рассматривать как спецификацию или новый стандарт API, похожий на REST, но более эффективный и гибкий.

В новой статье делаем детальный разбор преимуществ и недостатков GraphQL с примерами кода. Помогаем понять, стоит ли переходить на эту технологию в вашем проекте.

👉 Читать по этой ссылке
👑🧟 Король спама: насколько сильно ты бесишь коллег в рабочих чатах

Признайся, ты тоже иногда отправляешь голосовые сообщения из маршрутки? Или может быть, ты тот самый человек, который пишет «Привет» и исчезает на час? Всего 10 вопросов, которые помогут понять, являешься ли ты мастером цифрового этикета или главным спамером офиса. Готов узнать правду?

👉 Пройти тест
YYYY? yyyy!

Задумывались ли вы, как одна небольшая опечатка в коде может привести к неожиданным последствиям?

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

Подробнее о том, как избежать подводных камней при работе с датой в статье.
Please open Telegram to view this post
VIEW IN TELEGRAM