Javaにおける複数のEnumクラスをキーとするマップの効率的な実装
Javaで複数のEnumクラス,例えば,enum1,enum2があり,これらは同じ概念の名前を定義しています.そのため,以下のようにenum1, enum2の両方をキーとして使用するmapを利用する場面があります.
java
1public enum enum1 { 2 APPLE, 3 ORANGE 4} 5public enum enum2 { 6 APPLE, 7 BANANA 8} 9 10public static void main(String[] args) { 11 Map<Enum<?>, Object> map = new HashMap<>(); 12 map.put(enum1.APPLE, object1); 13 map.put(enum2.APPLE, object2); 14 ... 15}
状況としては,enum1はライブラリ側が定義,enum2はユーザ側が定義するものです.StringではなくEnum型を採用している理由は以下のとおりです.
- ユーザが同じ名前を使用したとしても別々の定義として扱いたい.例えば,上記のAPPLEはそれぞれ別物として扱いたい.
- 名前比較を大量に行うので,インスタンスによる比較で高速に処理したい.
さらに,上記のようなMapのインスタンスを大量に生成します.
Enumクラスを複数定義しているのでEnumMapは利用できませんが,実行時にはすべての定数が決まっているため,できるだけメモリ使用量,計算量ともに最小にしたいです(計算資源を多少気にする状況です).現在は,Enum<?>をキーとするHashMapを利用していますが,hashの衝突が発生しうる上に,負荷係数設定の関係でメモリも余分に使用しています.
より良い実装(Enum以外のクラスを使用する方法,効率的なマッピングの方法など)のアイデアがありましたら教えていただきたいです.
追記
効率に関しては,最終的には時間計算量の削減,次点で空間計算量の削減ですが,理論上改善しうる実装がないかという意図です.
Enumクラスは2つとは限りません.任意です.
考えたこと
実行時に enum1, enum2 の定数に動的にインデックス番号を割り振って,それによって配列操作をすればマッピング可能ですが,インデックス番号の割り振りに Map を使うので根本的解決にはならない.実行時に動的にインデックス番号を割り振って HashMap よりも高速にアクセスする方法はあるか?
