我已经创建了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((;