Please open Telegram to view this post
VIEW IN TELEGRAM
😁18💯3👍2🔥1
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) в среднем.
⚖️ Важные нюансы
HashSet НЕ наследует HashMap, а содержит его как поле. Все методы делегируют вызовы.
HashSet допускает один null (так как HashMap допускает null key).
Элементы ДОЛЖНЫ корректно реализовывать hashCode() и equals().
Для concurrent доступа:
— Collections.synchronizedSet(new HashSet<>());
— ConcurrentHashMap.newKeySet();
— CopyOnWriteArraySet (для read-heavy нагрузки).
Как у HashMap, можно указать при создании. Это помогает избегать resize операций.
→ Быстрой проверки наличия
→ Автоматического удаления дубликатов
→ Операций над множествами. Объединение, пересечение, разность за O(n).
→ Максимальной производительности без затрат на сортировку.
Ставьте 🔥, если хотите ещё разбор.
#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍2👏1
Deep Learning в Enterprise
Java-стек всё активнее внедряет AI (DeepLearning4j, Spring AI). Чтобы быть конкурентным сеньором, нужно понимать не только JVM, но и то, как работают нейронные связи на языке математики.
Завтра стартует курс «Математика для разработки AI-моделей».
— Без воды.
— Всего 28 200 ₽.
— Успей до начала занятий.
Расширяйте компетенции:
🔗 Записаться
☕️ Тест (пока компилируется проект)
Java-стек всё активнее внедряет AI (DeepLearning4j, Spring AI). Чтобы быть конкурентным сеньором, нужно понимать не только JVM, но и то, как работают нейронные связи на языке математики.
Завтра стартует курс «Математика для разработки AI-моделей».
— Без воды.
— Всего 28 200 ₽.
— Успей до начала занятий.
Расширяйте компетенции:
🔗 Записаться
☕️ Тест (пока компилируется проект)
🔧 Apache Commons — библиотека, которая тебе точно нужна
Apache Commons — это коллекция утилит, которую многие видели, но мало кто использует на полную. Внутри есть решения для задач, которые вы пишете руками почти в каждом проекте.
🔹 StringUtils.defaultIfBlank()
Сколько раз вы писали проверку: "если строка не null, не пустая и не состоит из пробелов — используй её, иначе дефолт"?
В Commons это одна строчка. Причём работает правильно во всех граничных случаях, о которых вы можете забыть в 2 часа ночи перед релизом.
🔹 BidiMap: когда HashMap уже не хватает
Представьте: у вас есть маппинг email → userId, и вам постоянно нужно искать и в одну сторону, и в другую. Обычное решение — две Map синхронизировать вручную.
В Commons есть BidiMap, который делает reverse lookup за O(1) и автоматически поддерживает консистентность.
Идеально для кэшей, где ключ и значение равноправны.
🔹 LRUMap: кэширование без библиотек
Нужен простой in-memory кэш с автоматическим вытеснением старых записей?
Commons даёт готовую LRU реализацию. Никаких зависимостей от Caffeine или Guava, никаких настроек — просто работающий кэш.
При превышении лимита старые элементы выбрасываются автоматически. Для 80% задач кэширования этого достаточно.
🔹 FileAlterationObserver: hot reload без костылей
Хотите, чтобы приложение подхватывало изменения в конфиге без рестарта?
Commons умеет следить за файловой системой и уведомлять об изменениях. Без polling'а каждую секунду, без самописных велосипедов.
🔹 RandomStringUtils: токены и коды
Генерация случайных строк — частая задача. API токены, коды подтверждения, тестовые данные.
В Commons это решается одной строчкой, причём с выбором символов: только буквы, только цифры, алфавитно-цифровые.
Не криптографически стойкий генератор, но для большинства бизнес-задач идеален.
🔹 Bag: подсчёты без Map<T, Integer>
Нужно считать, сколько раз встретился элемент? Обычно делают Map и вручную инкрементят счётчик.
В Commons есть Bag — структура данных специально для этого. Добавляете элементы, она сама считает.
Удобно для статистики, метрик, анализа логов.
🔹 WordUtils: текст для людей
Форматирование текста с переносами — казалось бы, простая задача. Но нужно учитывать границы слов, не ломать их посередине, правильно обрабатывать пробелы.
Commons делает это правильно.
Для CLI-приложений, email-рассылок, генерации отчётов — везде, где текст должен выглядеть аккуратно.
📌 Commons — это не просто набор утилит. Это годы production опыта, упакованные в API. Каждый класс решает реальную проблему, с которой вы уже сталкивались или столкнётесь. И решает правильно, со всеми edge cases.
Вместо того чтобы писать в сотый раз StringHelper или FileWatcher, можно просто использовать готовое. Меньше кода, меньше багов, больше времени на бизнес-логику.
💬 Какие утилиты часто используете?
🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
🐸 Библиотека джависта
#Enterprise
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-рассылок, генерации отчётов — везде, где текст должен выглядеть аккуратно.
Вместо того чтобы писать в сотый раз StringHelper или FileWatcher, можно просто использовать готовое. Меньше кода, меньше багов, больше времени на бизнес-логику.
🔹 Курс «Алгоритмы и структуры данных»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib
#Enterprise
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3❤2