Java HashSet <string>对象的冲突

时间:2017-05-29 09:31:25

标签: java collections hashset

我使用HashSet<String>来存储值,但是一些String具有相同的哈希码。 HashSet如何处理冲突。

List<ClassA> getValuesFromA(){

}

List<ClassA> getValuesFromB(){

}

Set <String> a = new HashSet<String>(getValuesFromA()); // data overwritten due to hash code collision

Set <String> b = new HashSet<String>(getValuesFromB()); // data overwritten due to hash code collision

a.removeAll(b);
a.stream().forEach(t -> t.setSomeValue(X));
b.addAll(a);

我使用HashSet在每个元素的O(1)中找到负b,然后是b +(a - b)。但是在HashSet中存储数据时,一些数据会被覆盖。有没有人知道在不改变哈希方法或数据结构的情况下执行此操作?

1 个答案:

答案 0 :(得分:0)

  

但是当在HashSet中存储数据时,我丢失了一些数据。如何   处理这个?

hashCode()结果中的冲突不会松散或覆盖哈希集中具有相同哈希码的对象。
具有相同哈希码的两个对象可以存储在同一个哈希集中。

在您的示例代码中,您可以这样做:

Set <String> a = new HashSet<String>(getValuesFromA());

Set <String> b = new HashSet<String>(getValuesFromB());

a.removeAll(b);

a开始,您删除b中包含的所有值 因此a将包含a减去b values 你做了一个排除。

然后你做:

b.addAll(a);

b中添加a仅<{1}} 值的b值时,它不是交集。

你应该使用Jon Skeet建议的retainAll()方法,这似乎符合你的要求:

  

仅保留此集合中包含的元素   指定的集合

Set<String> intersectionSet = new HashSet<>(getValuesFromA());    

intersectionSet.retainAll(getValuesFromB());