Guava + Trove Multimapの実装を本当に確認しましたか?このように:
final int listCapacity = 10; // Intege.MAX_VALUE isn't an option
final ListMultimap<Integer, Integer> multimap =
Multimaps.newListMultimap(
TDecorators.wrap(
new TIntObjectHashMap<Collection<Integer>>()), //Map<int, Collection>
new Supplier<List<Integer>>() {
@Override
public List<Integer> get() {
return TDecorators.wrap(new TIntArrayList(listCapacity)); //List<int>
}
});
あなたは完全に吹き飛ばされるでしょうListMultimap<Integer, Integer>
、それであなたはすることができます:
multimap.putAll(1, Ints.asList(1, 11, 111, 1, 1111));
multimap.putAll(2, Ints.asList(2, 22, 222, 2, 2222));
multimap.put(3, 333);
System.out.println("multimap: " + multimap);
System.out.println("get(2): " + multimap.get(2));
System.out.println("get(3): " + multimap.get(3));
System.out.println("get(4): " + multimap.get(4));
出力:
multimap: {3=[333], 2=[2, 22, 222, 2, 2222], 1=[1, 11, 111, 1, 1111]}
get(2): [2, 22, 222, 2, 2222]
get(3): [333]
get(4): []
各リストはのインスタンスでありTIntArrayList
、各マップはですTIntObjectHashMap
。これは非常にメモリ効率が高く、最適化されています(マップのパラメータを試してみる必要があります)。同時に使用できる、より最適化された実装を構築できるとは思いません。
唯一の欠点は自動ボクシングのコストですが、それほど多くのメモリを消費せず、おそらく時間もかかりません。