我有一个用于我的 Java 类的程序,我想在其中使用 hashSets 来比较文本文档的目录。本质上,我的计划是为每篇论文创建一个字符串的 hashSet,然后将其中两个论文 hashSet 一起添加到一个 hashSet 中,并找到相同的 6 字序列的数量。
我的问题是,我是否必须手动检查和处理冲突,还是 Java 会为我这样做?
Java Hash Maps/Sets 自动处理 Hash 冲突,这就是为什么覆盖 theequals
和hashCode
方法很重要的原因。因为它们都被 Sets 用来区分重复或唯一的条目。
同样重要的是要注意,这些哈希冲突会影响性能,因为多个对象被同一个哈希引用。
public class MyObject {
private String name;
//getter and setters
public int hashCode() {
int hashCode = //Do some object specifc stuff to gen hashCode
return int;
}
public boolean equals(Object obj) {
if(this==obj) return true;
if(obj instanceOf MyObject) {
if(this.name.equals((MyObject)obj.getName())) {
return true;
}
return false;
}
}
}
注意:标准 Java 对象(例如 String)已经实现了 hashCode 和 equals,因此您只需为您自己的数据对象类型执行此操作。
我认为您没有要求哈希冲突,对吗?问题是当 HashSet a 和 HashSet b 例如通过 a.addAll(b) 添加到单个集合中时会发生什么。
答案是一个将包含所有元素并且没有重复项。对于字符串,这意味着您可以在添加之前使用 a.size() 计算集合中相等字符串的数量 - 在 add + b.size() 之后使用 a.size()。
如果某些字符串具有相同的哈希码但不相等,这甚至无关紧要。