8

序数はhashCodeの完全な候補のように見えるため、 enum hashCodeはJava の序数を参照していると常に考えていましたが、 enum hashCodeは実際にはデフォルトのhashCode オブジェクト実装を参照していることが判明しました。

これはJLSと矛盾しないことは理解していますが、それでもこれは驚きであり、なぜこのように作成されたのかわかりません。私はJVMを推測しますが、一意の保証を提供するために何らかの形でこれに依存できた可能性がありますが、これは 64 ビットJVMには当てはまりません。

JDK 1.6 と最新の JDK 7 をチェックインしましたが、これは両方で同じ方法です。

なぜこのように作られたのか、理由を知っている人はいますか?

ordinalhashCodeとして使用することは完全に理にかなっています。これは、必要なすべての資格情報を満たし、ある JVM の開始から別の JVM の開始まで一貫性があるためです。これは必須ではありませんが、あると便利です。

4

2 に答える 2

8

この些細な、完全に作り上げられたシナリオを想像してみてください。

interface MediaType {}

enum BookTypes implements MediaType {
    HARDCOVER;
}

enum MagazineTypes implements MediaType {
    MONTHLY;
}

Map<MediaType, MediaItem> itemMap = new HashMap<MediaType, MediaItem>();
itemMap.put(BookTypes.HARDCOVER, new Book());
itemMap.put(MagazineTypes.MONTHLY, new Magazine());

この場合、序数をハッシュ コードとして使用したくない理由は明らかだと思います。

于 2013-03-06T08:01:34.287 に答える
3

ハッシュコードと序数は完全に異なります。

すべての列挙型の最初のインスタンスは、ハッシュコードの反対である同じ順序値を持ちます。

ordinal()この列挙定数の序数を返します(列挙型宣言内の位置。初期定数にはゼロの序数が割り当てられます)。

enum BookTypes implements MediaType {
    HARDCOVER;  //ordinal is 0
}

enum MagazineTypes implements MediaType {
    MONTHLY; //ordinal is 0
}
于 2013-03-06T07:56:34.560 に答える