2

同様のIDを持つ複数のレコードがあります。データベースは非常にレガシーです。そんなユニークなコラムはありません。作成日列は、データベース内の行作成のタイムスタンプを保持するために使用されます。何らかの操作を行うために、Javaマップに記録を保持する必要があります。レコードが変更されると、新しいレコードが作成されます。すべてのフィールドを hashcode と equals 内に保持したくありません。なぜなら、IDに対してどの列が変更されているのかわからないからです。

まず、乱数ジェネレーターを使用して一意のハッシュコードを試します。できます。

次に、作成日列をハッシュコードに入れることにしました。それも機能します。

日付をハッシュコードに入れるデメリットはありますか?

4

3 に答える 3

7

hashCode と equals は同じフィールドを使用する必要があり、これらのフィールドは事実上不変でなければなりません (つまり、ハッシュされたコレクションに追加した後は変更されません)。

これには、日付または任意のフィールドを含めることができます。

ところで、不変にすることができ、わずかに高速であるため、long代わりに使用することを好みます。Date

タイムスタンプを ID として使用する場合は、ミリ秒 (またはタイムスタンプを保存できる場合はマイクロ秒) を押し上げることで一意であることを確認することもできます。

private static final AtomicLong TIME_STAMP = new AtomicLong();
// can have up to 1000 ids per second.
public static long getUniqueMillis() {
    long now = System.currentTimeMillis();
    while (true) {
        long last = TIME_STAMP.get();
        if (now <= last)
            now = last + 1;
        if (TIME_STAMP.compareAndSet(last, now))
            return now;
    }
}

また

private static final AtomicLong TIME_STAMP = new AtomicLong();
// can have up to 1000000 ids per second.
public static long getUniqueMicros() {
    long now = System.currentTimeMillis() * 1000;
    while (true) {
        long last = TIME_STAMP.get();
        if (now <= last)
            now = last + 1;
        if (TIME_STAMP.compareAndSet(last, now))
            return now;
    }
}
于 2013-07-29T07:59:06.603 に答える
0

Map に何かを入れた場合、後でキーを使用して取得する必要があると思います。キーの HashCode() は、要素が属するバケットを識別するために使用されます。次に、バケット内のすべての要素に対して equals() メソッドを使用して一致を見つけます。hashcode() に乱数ジェネレーターを使用すると、キーが変更されていない場合、hashcode() 関数は毎回同じ値を返す必要があるため、マップでキーを見つけることができなくなります。

于 2013-07-29T07:59:32.370 に答える
0

まず、これらequals()hashCode()オブジェクトを.HashMap

これらのオブジェクトが互いに「等しい」とはどういう意味かを決定する何らかの概念が必要です。この概念を反映する方法でequals()andメソッドを実装する必要があります。hashCode()

ハッシュコードに乱数を使用することは、equals()常に返される場合を除き、悪い考えですfalse(したがって、2 つのオブジェクトが互いに等しくなることはありません)。そしてもちろん、呼び出されるたびに新しい乱数を返してはいけませんhashCode()(オブジェクトをハッシュベースのコレクションに格納すると、奇妙なエラーが発生する可能性があります)。

hashCode()2 つのオブジェクトが互いに等しいかどうかを決定する基準の 1 つである限り、計算の一部として日付を使用しても問題はありません。

于 2013-07-29T07:59:39.340 に答える