java哈希集中的重复项
似乎哈希集中允许重复。为什么会这样,我如何删除它们,为什么下面的第二个java哈希集中的重复项,java,duplicates,hashset,duplicate-removal,Java,Duplicates,Hashset,Duplicate Removal,似乎哈希集中允许重复。为什么会这样,我如何删除它们,为什么下面的第二个remove()不起作用?删除所有重复项的一种方法是newhashset(set),但是有没有更好的方法不涉及创建新对象 Set<ArrayList<String>> set = new HashSet<>(); ArrayList<String> a1 = new ArrayList<>(); ArrayList<String> a2 = new Arr
remove()
不起作用?删除所有重复项的一种方法是newhashset(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);
哈希在bucketing的插入时发生。如果随后更改对象,其哈希代码将更改,但它已经在其bucket中。它将无法(直接)检索,因为您将尝试使用与插入它时使用的哈希代码不同的哈希代码检索它
a1.add("a");
set.add(a1); // hashed and bucketed
a1.remove("a"); // hash code changes but doesn't affect set
set.add(a2); // hashes to a different place than a1
哈希在bucketing的插入时发生。如果随后更改对象,其哈希代码将更改,但它已经在其bucket中。它将无法(直接)检索,因为您将尝试使用与插入它时使用的哈希代码不同的哈希代码检索它
a1.add("a");
set.add(a1); // hashed and bucketed
a1.remove("a"); // hash code changes but doesn't affect set
set.add(a2); // hashes to a different place than a1
元素在HashMap中的存储位置取决于添加该元素时该元素的
hashCode
如果在添加元素后,您更改了该元素的属性,导致其哈希代码发生更改(对于ArrayList元素,从列表中删除元素正好是这样),则尝试在哈希集中查找该元素(或将其删除)将失败。元素在HashMap中的存储位置取决于添加该元素时该元素的
hashCode
如果在添加元素后,您更改了该元素的属性,导致其哈希代码发生更改(对于ArrayList元素,从列表中删除元素正好是这样),则尝试在哈希集中查找该元素(或将其删除)将失败。如果修改映射的键或集合的元素,则实际上是在破坏它。集合无法知道您已更改了元素,也无法正确处理它
如果要修改键或元素,必须先将其删除、修改并重新添加。如果修改地图的键或集合的元素,则实际上是在破坏它。集合无法知道您已更改了元素,也无法正确处理它 如果你想修改一个键或元素,你必须先删除它,修改它,然后把它重新添加进去。或“不可变类的有用性”或“不可变类的有用性”。。。