【发布时间】:2012-10-06 05:39:25
【问题描述】:
我有一个用于我的 Java 类的程序,我想在其中使用 hashSets 来比较文本文档的目录。本质上,我的计划是为每篇论文创建一个字符串的 hashSet,然后将两个论文的 hashSet 一起添加到一个 hashSet 中,并找到相同的 6 词序列的数量。
我的问题是,我是否必须手动检查和处理冲突,还是 Java 会为我做这些?
【问题讨论】:
-
你可以找到你 ans here
我有一个用于我的 Java 类的程序,我想在其中使用 hashSets 来比较文本文档的目录。本质上,我的计划是为每篇论文创建一个字符串的 hashSet,然后将两个论文的 hashSet 一起添加到一个 hashSet 中,并找到相同的 6 词序列的数量。
我的问题是,我是否必须手动检查和处理冲突,还是 Java 会为我做这些?
【问题讨论】:
Java Hash Maps/Sets 自动处理 Hash 冲突,这就是为什么重写 equals 和 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;
}
}
}
注意:String 等标准 Java 对象已经实现了 hashCode 和 equals,因此您只需为自己的数据对象执行此操作。
【讨论】:
我认为您没有要求哈希冲突,对吧?问题是当 HashSet a 和 HashSet b 添加到单个集合中时会发生什么,例如通过 a.addAll(b)。
答案是 a 将包含所有元素并且没有重复项。在字符串的情况下,这意味着您可以在 add + b.size() 之前使用 a.size() 从集合中计算相等字符串的数量 - a.size() 在 add + b.size() 之后。
即使某些字符串具有相同的哈希码但不相等也没关系。
【讨论】: