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

Список наших каналов: https://t.iss.one/proglibrary/9197

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

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

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
🔍Тестовое собеседование с ТехЛидом из МТС уже завтра

3 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Илья Аров, старший разработчик в МТС, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot

Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Обратная связь

Какая рубрика нравится больше? Если забыли, о чём рубрика, можно освежить в памяти тут.

🔥#CoreJava
👍🏼#Enterprise
👾#DevLife
🤔#News
❤️ → Всё нравится :))

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

#DevLife
Please open Telegram to view this post
VIEW IN TELEGRAM
17👍12🔥6👾4
👀 Внутреннее устройство HashSet

HashSet — это реализация интерфейса Set на основе HashMap. Хранит уникальные элементы без дубликатов с быстрым O(1) поиском.

📦 Базовая структура

HashSet — это тонкая обёртка над HashMap:
public class HashSet<E> {
private transient HashMap<E, Object> map;
private static final Object PRESENT = new Object();

public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
}


▪️ Главные особенности

→ Элементы хранятся как ключи HashMap.
→ Значения — константа PRESENT (заглушка).
→ O(1) для add, remove, contains (как у HashMap).
→ Не гарантирует порядок элементов.
→ Не допускает дубликаты (ключи Map уникальны).

🔍 Как устроено хранение

🔹 Внутренняя структура идентична HashMap:

HashMap<E, PRESENT>:

table[]:
[0]: null
[1]: Entry(key="B", value=PRESENT) → Entry(key="M", value=PRESENT)
[2]: Entry(key="A", value=PRESENT)
[3]: Entry(key="C", value=PRESENT)
[4]: null
...

Set элементы = ключи HashMap
Значения = PRESENT (игнорируются)


🔹 Все операции делегируются HashMap

add(E element) — добавление

1. Вызывается map.put(element, PRESENT).
2. HashMap вычисляет hash(element).
3. Определяется бакет по индексу.
4. Проверяется наличие ключа через equals():
— Если есть: возвращается false (дубликат не добавлен).
— Если нет: создаётся Entry, возвращается true.

Сложность: O(1) в среднем.

🔎 contains(Object o) — проверка наличия

1. Вызывается map.containsKey(o).
2. HashMap ищет ключ по hash и equals().
3. Возвращается true/false.

Сложность: O(1) в среднем.

remove(Object o) — удаление

1. Вызывается map.remove(o).
2. HashMap находит и удаляет ключ.
3. Возвращается true если элемент был, иначе false.

Сложность: O(1) в среднем.

⚖️ Важные нюансы

1️⃣ Наследование и делегирование

HashSet НЕ наследует HashMap, а содержит его как поле. Все методы делегируют вызовы.

2️⃣ Null элемент

HashSet допускает один null (так как HashMap допускает null key).

3️⃣ Equals и hashCode

Элементы ДОЛЖНЫ корректно реализовывать hashCode() и equals().

4️⃣ Не потокобезопасен

Для concurrent доступа:
Collections.synchronizedSet(new HashSet<>());
ConcurrentHashMap.newKeySet();
CopyOnWriteArraySet (для read-heavy нагрузки).

5️⃣ Initial capacity и load factor

Как у HashMap, можно указать при создании. Это помогает избегать resize операций.

✔️ Полезен для

→ Быстрой проверки наличия
→ Автоматического удаления дубликатов
→ Операций над множествами. Объединение, пересечение, разность за O(n).
→ Максимальной производительности без затрат на сортировку.

🔗 Документация: JavaDoc (Java 17)

Ставьте 🔥, если хотите ещё разбор.

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

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍2👏1
Deep Learning в Enterprise

Java-стек всё активнее внедряет AI (DeepLearning4j, Spring AI). Чтобы быть конкурентным сеньором, нужно понимать не только JVM, но и то, как работают нейронные связи на языке математики.

Завтра
стартует курс «Математика для разработки AI-моделей».

— Без воды.
— Всего 28 200 ₽.
— Успей до начала занятий.

Расширяйте компетенции:

🔗 Записаться

☕️ Тест (пока компилируется проект)
👍1
🔧 Apache Commons — библиотека, которая тебе точно нужна

Apache Commons — это коллекция утилит, которую многие видели, но мало кто использует на полную. Внутри есть решения для задач, которые вы пишете руками почти в каждом проекте.

🔹 StringUtils.defaultIfBlank()

Сколько раз вы писали проверку: "если строка не null, не пустая и не состоит из пробелов — используй её, иначе дефолт"?

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

String name = StringUtils.defaultIfBlank(user.getName(), "Anonymous");


🔹 BidiMap: когда HashMap уже не хватает

Представьте: у вас есть маппинг email → userId, и вам постоянно нужно искать и в одну сторону, и в другую. Обычное решение — две Map синхронизировать вручную.

В Commons есть BidiMap, который делает reverse lookup за O(1) и автоматически поддерживает консистентность.

BidiMap<String, Integer> userIds = new DualHashBidiMap<>();
String email = userIds.getKey(12345); // обратный поиск


Идеально для кэшей, где ключ и значение равноправны.

🔹 LRUMap: кэширование без библиотек

Нужен простой in-memory кэш с автоматическим вытеснением старых записей?

Commons даёт готовую LRU реализацию. Никаких зависимостей от Caffeine или Guava, никаких настроек — просто работающий кэш.

Map<String, Data> cache = new LRUMap<>(1000);


При превышении лимита старые элементы выбрасываются автоматически. Для 80% задач кэширования этого достаточно.

🔹 FileAlterationObserver: hot reload без костылей

Хотите, чтобы приложение подхватывало изменения в конфиге без рестарта?

Commons умеет следить за файловой системой и уведомлять об изменениях. Без polling'а каждую секунду, без самописных велосипедов.

observer.addListener(new FileAlterationListenerAdaptor() {
public void onFileChange(File file) { reloadConfig(); }
});


🔹 RandomStringUtils: токены и коды

Генерация случайных строк — частая задача. API токены, коды подтверждения, тестовые данные.

В Commons это решается одной строчкой, причём с выбором символов: только буквы, только цифры, алфавитно-цифровые.

String token = RandomStringUtils.randomAlphanumeric(32);


Не криптографически стойкий генератор, но для большинства бизнес-задач идеален.

🔹 Bag: подсчёты без Map<T, Integer>

Нужно считать, сколько раз встретился элемент? Обычно делают Map и вручную инкрементят счётчик.

В Commons есть Bag — структура данных специально для этого. Добавляете элементы, она сама считает.

Bag<String> errors = new HashBag<>();
errors.add("NullPointer", 5);
int count = errors.getCount("NullPointer");


Удобно для статистики, метрик, анализа логов.

🔹 WordUtils: текст для людей

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

Commons делает это правильно.

String wrapped = WordUtils.wrap(longText, 80);


Для CLI-приложений, email-рассылок, генерации отчётов — везде, где текст должен выглядеть аккуратно.

📌 Commons — это не просто набор утилит. Это годы production опыта, упакованные в API. Каждый класс решает реальную проблему, с которой вы уже сталкивались или столкнётесь. И решает правильно, со всеми edge cases.

Вместо того чтобы писать в сотый раз StringHelper или FileWatcher, можно просто использовать готовое. Меньше кода, меньше багов, больше времени на бизнес-логику.

💬 Какие утилиты часто используете?

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥52
В чём разница между throw и throws?



throw — это когда один разработчик бросает исключение в другого.

throws — это когда вся команда бросает код в прод без ревью.

Ключевое: чем больше 's' в конце, тем больше народу пострадает.

✔️

throw — это оператор, который непосредственно выбрасывает исключение в коде:
throw new IllegalArgumentException("Ошибка");


throws — это ключевое слово в сигнатуре метода, которое декларирует, что метод может выбросить исключение (перекладывает обработку на вызывающий код):
public void readFile() throws IOException {
// код
}


💬 Добавим немного юмора?

😁 → Да
🔥 → Нет

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

#core
Please open Telegram to view this post
VIEW IN TELEGRAM
😁43🔥111👍1
🚀 Просто о сложном: паттерны проектирования микросервисов

Проектирование микросервисов — это не просто «разбить монолит на части». Нужны паттерны, которые помогают сервисам надёжно общаться, масштабироваться независимо и корректно восстанавливаться при сбоях.

Разбираем ключевые паттерны микросервисной архитектуры, которые должен знать каждый инженер:

1️⃣ API Gateway

→ Единая точка входа для всех клиентов
→ Скрывает сложность внутренней архитектуры
→ Берёт на себя аутентификацию, rate limiting, маршрутизацию
→ N запросов от клиента — 1 запрос через gateway

2️⃣ Saga Pattern

→ Для распределённых транзакций (когда несколько сервисов должны завершиться успешно или откатиться)
→ Два подхода: оркестрация или хореография
→ Гарантирует консистентность данных без глобальных блокировок

3️⃣ Circuit Breaker

→ Защищает систему от медленных или падающих downstream-сервисов
→ «Размыкает цепь» при превышении порога ошибок
→ Предотвращает каскадные падения
→ Автоматически восстанавливается после стабилизации

4️⃣ Event-Driven Architecture

→ Сервисы общаются через события вместо прямых вызовов
→ Слабая связанность компонентов
→ Отличная масштабируемость
→ Идеально для real-time обновлений

5️⃣ Strangler Fig

→ Постепенная миграция монолита
→ Выносим модули один за другим
→ Маршрутизируем трафик через gateway
→ Миграция без даунтайма

6️⃣ Database per Service

→ Каждый сервис владеет своими данными
→ Слабая связанность
→ Независимые деплои
→ Избегаем bottleneck «одной большой общей БД»

💬 Какие паттерны используете часто? Делитесь опытом в комментах 👇

🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
👍63🔥2
От Spring Boot к матричным разложениям

Java-разработчики привыкли к строгой типизации и надёжной архитектуре. Но когда дело доходит до анализа данных, возникает «чёрный ящик»: мы можем интегрировать ML-модель, но не всегда понимаем математическую логику её работы.

Чтобы реально прокачаться, нужно спуститься на уровень ниже библиотек — к линейной алгебре.

На курсе «Математика для разработки AI-моделей» мы перезапустили формат: теперь с живыми вебинарами. Первый уже прошёл (отзывы — огонь), но вы ещё успеваете влететь в поток.

Что разбираем на ближайших лекциях:

— векторы, матрицы, определители (основа эффективных вычислений);
— линейную регрессию и метод наименьших квадратов (реализуем алгоритм с нуля);
— SVD-разложение (ключ к созданию рекомендательных систем).

Это не сухая теория, а практика на NumPy.

Последний шанс присоединиться (до 9.12)
👍2🔥1👏1
✔️ Security-тест: Настройка Spring Security конфига

Напишите конфигурацию для production-приложения 👇

📦 Задание

Есть REST API с эндпоинтами:

/api/public/** — публичные данные
/api/user/** — данные пользователя
/api/admin/** — админ-панель
/actuator/health — health check
/actuator/** — остальные actuator endpoints

Настройте SecurityFilterChain с правильными правами доступа и защитой от основных атак.

📋 Требования

— Доступы

/api/public/** — доступ всем (включая неавторизованных)
/api/user/** — только авторизованным с ролью USER или ADMIN
/api/admin/** — только ADMIN
/actuator/health — доступ всем
/actuator/** — только ADMIN

Безопасность

→ Включить защиту от CSRF для state-changing операций
→ Настроить CORS: разрешить запросы только с https://example.com
→ Добавить security headers (XSS, clickjacking protection)
→ Использовать stateless сессии (JWT/token-based)
→ Настроить обработку ошибок 401/403

Ставьте → 🔥, если нравится формат. Если нет → 🤔

💬 Пишите решение в комментариях, главное прячьте под спойлер.

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

#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍3🎉1