Java-баг, который легко пропустить: HashSet больше не находит объект
Ты добавляешь собственный объект в
Как такое возможно?
Предположим, что методы
Сначала добавляем объект в коллекцию:
Затем меняем email:
Если после изменения поля изменился и
Главное правило: не изменяй поля, участвующие в
Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.
👉 Java Portal
Ты добавляешь собственный объект в
HashSet, а затем изменяешь одно из его полей. После этого set.contains(object) возвращает false, хотя объект всё ещё находится внутри коллекции.Как такое возможно?
Предположим, что методы
hashCode() и equals() зависят от email пользователя.Сначала добавляем объект в коллекцию:
user.email = "old@example.com";
set.add(user);
Затем меняем email:
user.email = "new@example.com";
Если после изменения поля изменился и
hashCode(), объект останется в той корзине (bucket), куда его поместили при добавлении. Но при поиске HashSet может обратиться уже к другой корзине — и не найти объект.Главное правило: не изменяй поля, участвующие в
equals() и hashCode(), пока объект находится в хеш-коллекции.Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🤔1
💡 Java Tip: Создаём компактный LRU-кэш без сторонних библиотек
Для реализации простого LRU-кэша в Java можно использовать встроенный
✅
✅ Переопределите
LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.
👉 Java Portal
Для реализации простого LRU-кэша в Java можно использовать встроенный
LinkedHashMap.✅
accessOrder = true — перемещает элемент в конец при каждом обращении через get(), поддерживая порядок использования.✅ Переопределите
removeEldestEntry() — чтобы автоматически удалять самый давно неиспользуемый элемент, когда кэш достигает заданного размера.LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Перестань так использовать Optional в Java
Вместо того чтобы проверять наличие значения через
Используй
Так код становится короче, чище и понятнее.
Помни:
👉 Java Portal
Вместо того чтобы проверять наличие значения через
isPresent() и извлекать его с помощью get():Optional<User> user = repo.findById(id);
if (user.isPresent()) {
return user.get();
}
Используй
orElseThrow():return repo.findById(id)
.orElseThrow(() -> new NotFoundException(id));
Так код становится короче, чище и понятнее.
Помни:
Optional — это тип возвращаемого значения, а не просто навороченная проверка на null.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1