料AboutJavaScriptを有効にして、ご利用ください。比較演算に用いるキーは不変にする順序集合やマップにおいてキーの役目を果たすオブジェクトは不変(immutable)でなくてはならない。メソッドは、オブジェクトを比較する際に不変な状態のみを比較しなくてはならない。このルールに違反すると、コレクションの順序の一貫性が失われる。Map<K,V>の仕様には、この点に関する注意書きが記されている。ついて以下のように記載されている。2006]注:可変オブジェクトをマップキーとして使用する場合は細心の注意が必要である。比較に影響を与える方法でオブジェクトの値が変更された場合、マップの動作は保証されない。この禁止事項の特殊な例として、マップがそれ自身をキーとして持つことができないことが挙げられる。マップがそれ自身を値として持つことは許可されるが、その場合は細心の注意が必要である。euqalsメソッドおよびhashCodeメソッドの結果は保証されない。Employeeを定義している。メソッドを使って変更される。equals()メソッドは、従業員の名前(name)に基づいて比較を行うようにオーバーライドされている。オブジェクトをマップキーとして使用するのは危険である。クライアントプログラムは、従業員の名字が変更されるとnameフィールドを変更することができる。その結果、クライアントプログラムはオブジェクトの一貫しない動作を観測することになる。employeeIDをクラスに追加しており、この値は初期化後変更することができない。メソッドはこのフィールドに基づいてEmployeeオブジェクトを比較する。クラスをマップキーとして安全に使用することができる。違反コードシリアライズするとハッシュコードが変わるという事実に驚くプログラマは少なくない。hashCode()メソッドの一般契約では、同じアプリケーションの別の実行でハッシュコードが同じであることは要求されていない。同様に、オブジェクトがシリアライズされ、後に復元される場合、復元後のハッシュコードは元のハッシュコードと異なるかもしれない。インデックスキーとして使用している。ドキュメントには以下のように記されている。メソッドが実装されていなければならない。仕様のアドバイスに従っているが、シリアライズと復元の後、問題が発生する。復元した後に元のキーを使ってオブジェクトの値を取り出すことはできない。}}適合コード以下の解決法では、キーの型をIntegerオブジェクトに変更している。これにより、同一のプログラムを何度実行しても、シリアライズと復元を行っても、あるいは異なるJVM実装でプログラムを実行しても、キーの値は同じままである。hashcode()をオーバーライドすることでこの問題を回避することもできたが、実装依存のパラメータを使用するハッシュテーブルをシリアライズしないのが最善の解決策である。比較演算に使用するキーを不変にしないと、プログラムの不安定な動作につながる。ツールの中には、可変フィールドから値を読み取るcompareTo()メソッドのインスタンスを検出するものがある。Map<K,V>翻訳元これは以下のページを翻訳したものです。有このページは役に立ちましたか?javascriptを有効にすると、ご回答いただけます。その他のご意見はPCサイトにて入力願います。