作者:西瓜凉皮大夏天 | 来源:互联网 | 2023-05-23 23:22
似乎HashSets中允许重复.为什么这样,我该如何去除它们,为什么第二个不能在remove()
下面工作呢?删除所有重复项的一种方法是new HashSet<>(set)
,但有没有更好的方法不涉及创建新对象?
Set> set = new HashSet<>();
ArrayList a1 = new ArrayList<>();
ArrayList 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 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());
System.out.println(set);
set.remove(new ArrayList());
System.out.println(set);
set.remove(set.iterator().next());
System.out.println(set);
System.out.println(set.iterator().next() == a1);
输出:set
由两个相等的空列表组成,最初不为空的列表无法删除.
2
[[], []]
[[]]
[[]]
[[]]
true
Eran..
6
元素存储在HashMap中的位置取决于hashCode
添加时该元素的位置.
如果在添加元素之后,您更改了导致其hashCode更改的元素的属性(在ArrayList元素的情况下,从列表中删除元素就是这样),尝试在HashSet中找到该元素(或者删除它)将失败.
1> Eran..:
元素存储在HashMap中的位置取决于hashCode
添加时该元素的位置.
如果在添加元素之后,您更改了导致其hashCode更改的元素的属性(在ArrayList元素的情况下,从列表中删除元素就是这样),尝试在HashSet中找到该元素(或者删除它)将失败.