你真的检查过 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
,它们非常节省内存和优化(顺便说一句,您应该尝试使用 Map 的参数)。我认为您无法构建同时可用的更优化的实现。
唯一的缺点是自动装箱成本,但它不会消耗那么多内存,更可能是时间。