0

目前我正在与ArrayListMultiMapGuave 合作,我处理超过 100.000 件物品。地图的键是 a byte array,值是long

现在我想减少开销。

我的想法是只使用原始集合和trove. 所以最后每个键(字节数组)都指向一个原始集合(原始长集)。

我的问题是如何使用字节数组作为 THashmap 中的键。在 Guave 中,我将字节数组包装在一个类中,但这会产生开销。

谢谢你

4

2 回答 2

4

您应该使用TCustomHashMap外部映射,因为您需要为byte[](真的,只有一个调用Arrays.hashCode(byte[])会很好)提出一个散列策略。

在外部地图中,使用 a TLongHashSet(或其他)作为值,一切就绪。

于 2016-08-25T14:09:18.650 回答
2

您可以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似乎是要走的路。

于 2016-08-25T13:50:24.937 回答