0

我使用 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;
}
. . .

这样做是个好习惯吗?

我尝试过的基准测试给出了更快的响应,但是一个陷阱是否嵌套在某个地方?

4

3 回答 3

1

理想情况下,对象的 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-25T09:34:24.260 回答
0

一般hashcode是根据对象的状态来确定的,如果在计算hashcode的时候不考虑对象的状态需要注意hashcode()equals()关系

于 2012-09-25T09:27:14.960 回答
0

您在那里所做的事情并不真正符合 hashCode 的合同

在您的系统中,除非两个对象是同时创建的,否则它们没有相同的 hashCode,因此您也可以使用Object该类的默认实现,如果它们是不同的实例,它会认为两个对象是不同的(这是这里发生的事情)。

如果这是所需的,我将删除该自定义代码...

于 2012-09-25T09:33:12.773 回答