6

私のアプリケーションには 2 種類のオブジェクトがあり、1 種類のすべてのオブジェクトには、もう 1 種類の対応するオブジェクトが 1 つだけあります。

この関係を追跡するための明白な選択はMap<type1, type2>、HashMap のような です。でも、なんとなく疑問です。オブジェクトをマップ内のキーとして使用し、それを渡したり、別のコレクションにも配置したり、いつでもマップからそのパートナーを取得したりできますか?

オブジェクトが作成された後、渡すのは識別子だけですよね? ですから、おそらく問題はありません。キーをシリアライズおよびデシリアライズするとどうなりますか?

その他の注意事項はありますか?自分で生成した数値など、オブジェクトのペアを関連付けるために別のものを使用する必要がありますか?

4

8 に答える 8

22
  1. キーは正しく実装する必要が.equals()あります.hashCode()
  2. キーは、キーとして使用されている間、その値を変更する方法で変更してはなりません.hashCode()
  3. でキーとして使用されるオブジェクトはすべてHashMap不変であることが理想的です。これにより、2. が常に true に保たれることが自動的に保証されます。
  4. そうでなければ GC できるオブジェクトは、キーおよび/または値として使用される場合に保持される可能性があります。
于 2009-03-11T15:25:43.260 に答える
7

私のアプリケーションには 2 種類のオブジェクトがあり、1 種類のすべてのオブジェクトには、もう 1 種類の対応するオブジェクトが 1 つだけあります。

これは本当に has-a 関係のように聞こえるため、単純な属性を使用して実装できます。

于 2009-03-11T15:26:32.090 に答える
3

選択したマップの実装によって異なります。

  • HashMapequals()hashCode()を使用します。デフォルトでは (オブジェクト内で)、これらはオブジェクト ID に基づいており、シリアライズ/デシリアライズしない限り問題なく機能します。オブジェクトの内容に基づいて equals() と hashCode() を適切に実装すれば、オブジェクトがハッシュ マップのキーである間に変更しない限り、問題はありません。

  • TreeMapcompareTo()を使用します。デフォルトの実装はないため、提供する必要があります。上記の hashCode() および equals() の実装と同じ制限が適用されます。

于 2009-03-11T15:30:37.743 に答える
1

標準の Map を使用することもできますが、そうすることで、Map 内のオブジェクトへの強い参照を維持することになります。オブジェクトが別の構造で参照されていて、それらをリンクするためだけに Map が必要な場合は、WeakHashMap の使用を検討してください。

ところで、オブジェクトの複数のインスタンスを等しいと見なす必要がない限り、 equals と hashCode をオーバーライドする必要はありません...

于 2009-03-11T15:28:11.757 に答える
1

オブジェクトをマップ内のキーとして使用し、それを渡したり、別のコレクションにも配置したり、いつでもマップからそのパートナーを取得したりできますか?

はい、ここではまったく問題ありません。

オブジェクトが作成された後、渡すのは識別子だけですよね? ですから、おそらく問題はありません。キーをシリアライズおよびデシリアライズするとどうなりますか?

そうです、参照を渡しているだけです。それらはすべて同じ実際のオブジェクトを指します。オブジェクトをシリアライズまたはデシリアライズすると、新しいオブジェクトが作成されます。ただし、オブジェクトが equals と hashCode を適切に実装している場合は、新しいデシリアライズされたオブジェクトを使用して、マップからアイテムを取得できます。

その他の注意事項はありますか?自分で生成した数値など、オブジェクトのペアを関連付けるために別のものを使用する必要がありますか?

警告に関しては、はい、オブジェクトがマップ内にある間、オブジェクトの hashCode を変更する原因となるものを変更することはできません。

于 2009-03-11T15:30:08.087 に答える
0

任意のオブジェクトをマップ キーにすることができます。ここで重要なことは、マップ キーとして使用されるオブジェクトの .equals() と .hashCode() をオーバーライドすることです。

これを行う理由は、そうしないと equals がオブジェクトの等価性として理解され、「等しい」マップ キーを見つけることができる唯一の方法は、元のオブジェクト自体へのハンドルを持つことになるからです。

equals と一致する必要があるため、ハッシュコードをオーバーライドします。これは、equals として定義したオブジェクトが同じようにハッシュされるようにするためです。

于 2009-03-11T15:25:45.383 に答える
0

失敗ポイントは hashcode と equals 関数です。一貫性のある適切な戻り値を生成しない場合、Map は奇妙な動作をします。効果的な Javaには、それらに関するセクション全体があり、非常に強くお勧めします。

于 2009-03-11T15:25:56.630 に答える
0

Google コレクションのBiMapを検討してください。

于 2009-03-11T15:35:50.257 に答える