java - java HashSet 中的重复项

标签 java hashset duplicates

HashSet 中似乎允许重复。为什么会这样,我该如何删除它们,为什么第二个不 remove()在下面工作?删除所有重复项的一种方法是 new HashSet<>(set) ,但有没有更好的方法不涉及创建新对象?

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

最佳答案

元素在 HashMap 中的存储位置取决于该元素在添加时的 hashCode

如果在添加元素后,您更改了该元素的属性,导致其 hashCode 发生变化(在 ArrayList 元素的情况下,从列表中删除一个元素正是这样做的),尝试在 HashSet 中找到该元素(或删除它)将失败。

关于java - java HashSet 中的重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28267445/

相关文章:

python - Pandas :删除重复但连续的行并将第一行保留在组中

java - 在数组中查找 3 个连续的重复字符?

java - 使用解析服务进行缓存

java - 将 json 对象消费到一个以 json 数组作为哈希集的类中

满足条件的元素的 Java 迭代器

java - 如何将 Java HashSet<Integer> 转换为原始 int 数组?

r - 在R中的data.table上撤消setkey()

java - spring如何在响应流中发送音频

java - 在 HTML 表格中显示旋转图像时出现意外的垂直缩放

kotlin - 来自2个现有数组的kotlindistant()或distinctBy {}