Ответ
Set по контракту хранит только уникальные элементы (на основе equals() и hashCode()). «Обойти» это ограничение — значит нарушить контракт коллекции, что приведет к непредсказуемому поведению. Вместо этого нужно выбрать правильную структуру данных для задачи.
Правильные альтернативы для хранения элементов с повторениями:
-
Использовать
List: Если важен порядок и допустимы дубликаты.List<String> list = new ArrayList<>(); list.add("test"); list.add("test"); // Оба добавятся -
Использовать
Mapдля подсчета: Если нужно хранить элемент и количество его вхождений.Map<String, Integer> countMap = new HashMap<>(); countMap.put("test", countMap.getOrDefault("test", 0) + 1); // Или с merge (Java 8+) countMap.merge("test", 1, Integer::sum); -
Использовать
Multisetиз библиотеки Guava: Это идеальное решение для задачи «коллекция с подсчетом дубликатов».// Добавление зависимости com.google.guava:guava Multiset<String> multiset = HashMultiset.create(); multiset.add("test"); multiset.add("test"); System.out.println(multiset.count("test")); // Вывод: 2
Что НЕЛЬЗЯ делать (антипаттерн):
- Модифицировать
equals/hashCodeу объектов, чтобы они всегда возвращали разные значения. Это сломает логику всех коллекций, основанных на хэшах (HashMap,HashSet). - Полагаться на то, что
Setбудет содержать разные объекты с одинаковым содержимым. Это ошибка дизайна, если объекты равны поequals().