我使用的是OpenSource OODB db4o,我的序列化类继承自一个通用的abstract.class,它有两个字段:
. . .
private final Long timeCreate = (System.currentTimeMillis() << 20) + (System.nanoTime() & 0xfffff);
private final int hashCode = timeCreate.hashCode();
. . .
@Override
public final int hashCode() {
return hashCode;
}
. . .这是一个很好的实践吗?
我尝试过的基准测试给出了更快的响应,但在某些地方嵌套了陷阱吗?
发布于 2012-09-25 17:34:24
理想情况下,对象的hashCode在任何情况下都不应该改变。一种选择是只按需生成它,但在您的示例中,您遇到的问题是timeCreate不一定是唯一的或单调递增。如果只有微秒级的分辨率,System.nanoTime()可以在1000次以上产生相同的值。
private static final AtomicLong TIME_ID = new AtomicLong(0);
private static long generateTimeId() {
long now = System.currentTimeMillis() * 1000000;
long id = TIME_ID.getAndIncrement();
if (id > now)
return id;
TIME_ID.compareAndSet(id+1, now);
return TIME_ID.getAndIncrement();
}
// produce a monotonically increasing time id.
private final long timeCreate = generateTimeId();
private final int hashCode = (int)((timeCreate >> 32) ^ timeCreate);注意:如果两个对象等于== true,则它们必须具有相同的hashCode。
发布于 2012-09-25 17:27:15
哈希码一般是根据对象的状态来确定的,如果在计算哈希码时不考虑对象的状态,就需要考虑hashcode()和equals()的关系
发布于 2012-09-25 17:33:13
你在那里做的事情并不是真正适合contract for hashCode。
在您的系统中,除非两个对象是完全同时创建的,否则它们不具有相同的hashCode,因此您也可以使用Object类的默认实现,这样,如果两个对象是不同的实例,它就认为它们是不同的(这里就是这样)。
如果这是需要的,我会删除自定义代码...
https://stackoverflow.com/questions/12579955
复制相似问题