Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java哈希集中的重复项_Java_Duplicates_Hashset_Duplicate Removal - Fatal编程技术网

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元素,从列表中删除元素正好是这样),则尝试在哈希集中查找该元素(或将其删除)将失败。

如果修改映射的键或集合的元素,则实际上是在破坏它。集合无法知道您已更改了元素,也无法正确处理它


如果要修改键或元素,必须先将其删除、修改并重新添加。

如果修改地图的键或集合的元素,则实际上是在破坏它。集合无法知道您已更改了元素,也无法正确处理它

如果你想修改一个键或元素,你必须先删除它,修改它,然后把它重新添加进去。

或“不可变类的有用性”或“不可变类的有用性”。。。