Java Portal | Программирование
11.9K subscribers
1.63K photos
119 videos
45 files
1.69K links
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика

Связь: @devmangx

РКН: https://clck.ru/3H4WUg
Download Telegram
Java-баг, который легко пропустить: HashSet больше не находит объект

Ты добавляешь собственный объект в 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(), пока объект находится в хеш-коллекции.
Иначе объект может физически оставаться в коллекции, но стать практически недоступным для поиска.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1👍1🤔1
💡 Java Tip: Создаём компактный LRU-кэш без сторонних библиотек

Для реализации простого LRU-кэша в Java можно использовать встроенный LinkedHashMap.

✅ accessOrder = true — перемещает элемент в конец при каждом обращении через get(), поддерживая порядок использования.
✅ Переопределите removeEldestEntry() — чтобы автоматически удалять самый давно неиспользуемый элемент, когда кэш достигает заданного размера.

LRU (Least Recently Used) — алгоритм, который удаляет элемент, к которому дольше всего не обращались.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Перестань так использовать Optional в Java

Вместо того чтобы проверять наличие значения через 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.

👉 Java Portal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1