Java:只需计算对象的哈希代码就可以从集合中检索对象



我已经创建了Event类。正如您所看到的,hashCode和equals方法都只使用long类型的id字段。

public class Event {
private long id;
private Map<String, Integer> terms2frequency;
private float vectorLength;
@Override
public long hashCode() {
    return this.id;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Event other = (Event) obj;
    if (id != other.id)
        return false;
    return true;
}

我将把这个类的对象存储在HashSet集合中。

Set<Event> events = new HashSet<Event>();

由于对于哈希计算,只有long类型的字段,我想通过计算id的哈希来从事件哈希集中检索元素。例如:

events.get(3);

这可能吗?或者我应该使用hashMap:

Map<Long, Event> id2event = new HashMap<Long, Event>();

您绝对不应该依赖哈希代码的唯一性。CCD_ 1具有264的可能值;一个CCD_ 2只有232。因此,散列冲突是完全可能的不要使用哈希码作为唯一的相等性测试。这不是它们的设计目的

哈希码的设计目的是快速从一个密钥获取一组潜在的匹配,然后用正常的等式对其进行更严格的检查。

(顺便说一句,我认为使用floatToIntBits来计算哈希码不是一个好主意。看看Long.hashCode()的作用。(

编辑:当然,即使确实想要依赖它,HashSet<E>也不会公开通过其哈希代码获取元素的方法,正是因为在几乎所有情况下这都是一个非常糟糕的想法。。。如果需要映射,请创建Map。。。

您可以生成一个静态类(例如:Utility(,并创建一个可以在其中生成唯一哈希的方法。但您必须估计可能会创建多少个对象,然后创建一个算法来生成唯一的以区分对象。此外,Event类的hashcode方法也应该被覆盖,因为您覆盖了equals方法。

并使用地图:

Map id2event=new HashMap((;

相关内容

最新更新