Кажется, что дубликаты разрешены в HashSets. Почему это, как я могу их удалить, и почему не работает второй remove()
? Один способ удаления всех дубликатов - new HashSet<>(set)
, но есть ли лучший способ, который не связан с созданием нового объекта?Дубликаты в java HashSet
Set<ArrayList<String>> set = new HashSet<>();
ArrayList<String> a1 = new ArrayList<>();
ArrayList<String> a2 = new ArrayList<>();
a1.add("a");
set.add(a1);
a1.remove("a");
set.add(a2);
System.out.println(set.size());
System.out.println(set);
ArrayList<String> a3 = new ArrayList<>();
for (Object o : set) {
boolean b = o.equals(a3) && (o.hashCode() == a3.hashCode());
if (!b) System.out.println(false);
}
set.remove(new ArrayList<String>());
System.out.println(set);
set.remove(new ArrayList<String>());
System.out.println(set);
set.remove(set.iterator().next());
System.out.println(set);
System.out.println(set.iterator().next() == a1);
Выход: set
состоит из двух одинаковых, пустых списков, и тот, который изначально не был пуст, не может быть удалено.
2
[[], []]
[[]]
[[]]
[[]]
true
Или «полезности неизменяемых классов» ... – fge