目前我正在使用Guave的ArrayListMultiMap
处理超过100,000件商品。地图的关键是byte array
,值为long
。
现在我想减少开销。
我的想法是只使用原始集合和trove
的散列图。所以最后每个键(字节数组)指向一个原始集合(原始长集)。
我的问题是如何在THashmap中使用字节数组作为键。在Guave中,我将字节数组包装在一个类中,但这会产生开销。
谢谢
答案 0 :(得分:3)
您应该使用TCustomHashMap
作为外部地图,因为您需要为byte[]
提出哈希策略(实际上,只有一个调用Arrays.hashCode(byte[])
会很好)
在外部地图中,使用TLongHashSet
(或其他)来表示值,并且您已完成设置。
答案 1 :(得分:2)
您可以直接使用byte array
作为密钥(无需包装等):
Map<byte[], TLongSet> map = new THashMap<>();
map.put(new byte[]{-0x80, 0x7F}, new TLongHashSet(new long[]{0xFFFFFFFF, 0x7FFFFFFF}));
System.out.println(map);
示例输出:
{[B@4d7e1886={2147483647,-1}}
编辑:
如果您不想要基于身份的密钥,则可以使用TByteArrayList
代替byte[]
。在我的机器上,每个实例的开销为25个字节。如果您的100,000个项目/长项中的每一个都存储在其自己的TLongSet
中,每个项目都映射到唯一的byte array
,那么这将产生2.5兆字节(25字节x 100,000)的开销。对于我来说,这似乎是一种更糟糕的情况,但是如果你确实想要避免这种情况,那么Rob Eden answer TCustomHashMap
似乎还有一段路要走。< / p>