0

私はOpenSourceOODBdb4oを使用しており、シリアル化されたクラスは2つのフィールドを持つ共通の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はどのような場合でも変更されるべきではありません。1つのオプションは、オンデマンドでのみ生成することですが、あなたの場合、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);

注:2つのオブジェクトが等しい== trueの場合、それらは同じhashCodeを持っている必要があります。

于 2012-09-25T09:34:24.260 に答える
0

そこで行っていることは、 hashCodeの契約に実際には適合しません。

システムでは、2 つのオブジェクトがまったく同時に作成されない限り、同じ hashCode を持たないため、Objectクラスのデフォルトの実装を使用することもできます。これにより、2 つのオブジェクトが異なるインスタンス (これはここで起こることです)。

それが望ましい場合は、そのカスタムコードを削除します...

于 2012-09-25T09:33:12.773 に答える
0

hashcode()一般に、ハッシュコードはオブジェクトの状態に基づいて決定されます。注意が必要なハッシュコードとequals()関係を計算するときにオブジェクトの状態を考慮しない場合

于 2012-09-25T09:27:14.960 に答える