首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一次计算并覆盖hashCode是一种好的做法吗

一次计算并覆盖hashCode是一种好的做法吗
EN

Stack Overflow用户
提问于 2012-09-25 17:24:50
回答 3查看 158关注 0票数 0

我使用的是OpenSource OODB db4o,我的序列化类继承自一个通用的abstract.class,它有两个字段:

代码语言:javascript
复制
. . .
private final Long timeCreate = (System.currentTimeMillis() << 20) + (System.nanoTime() & 0xfffff);
private final int hashCode = timeCreate.hashCode();
. . . 
@Override
public final int hashCode() {
    return hashCode;
}
. . .

这是一个很好的实践吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-25 17:34:24

理想情况下,对象的hashCode在任何情况下都不应该改变。一种选择是只按需生成它,但在您的示例中,您遇到的问题是timeCreate不一定是唯一的或单调递增。如果只有微秒级的分辨率,System.nanoTime()可以在1000次以上产生相同的值。

代码语言:javascript
复制
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。

票数 1
EN

Stack Overflow用户

发布于 2012-09-25 17:27:15

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

票数 0
EN

Stack Overflow用户

发布于 2012-09-25 17:33:13

你在那里做的事情并不是真正适合contract for hashCode

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

如果这是需要的,我会删除自定义代码...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12579955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档