目前我正在与ArrayListMultiMap
Guave 合作,我处理超过 100.000 件物品。地图的键是 a byte array
,值是long
。
现在我想减少开销。
我的想法是只使用原始集合和trove
. 所以最后每个键(字节数组)都指向一个原始集合(原始长集)。
我的问题是如何使用字节数组作为 THashmap 中的键。在 Guave 中,我将字节数组包装在一个类中,但这会产生开销。
谢谢你
您应该使用TCustomHashMap
外部映射,因为您需要为byte[]
(真的,只有一个调用Arrays.hashCode(byte[])
会很好)提出一个散列策略。
在外部地图中,使用 a TLongHashSet
(或其他)作为值,一切就绪。
您可以byte array
直接使用 a 作为密钥(无需包装等):
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的答案aTCustomHashMap
似乎是要走的路。