如果我的地图需要更小而不是更快,我应该使用哪个Map的实现?

8 浏览
0 Comments

如果我的地图需要更小而不是更快,我应该使用哪个Map的实现?

我在我的程序中习惯使用HashMap,因为我知道它通常是最高效的(如果使用正确),并且可以轻松处理大型映射。我知道EnumMap对于枚举键非常有用,但通常我生成的是一个很小的映射,不会变得很大,很快就会被丢弃,并且没有并发问题。

对于这些小的、局部的和临时的用途,HashMap是否太复杂了?有没有另一种简单的实现可以在这些情况下使用?

我认为我正在寻找一个类似于ArrayList对于ListMap实现。它存在吗?

稍后添加的回应:

下面是一个可能更好的情况示例 - 当我有很多很多这样的Map时。例如,假设我有大约一百万个这样的小小映射,每个映射只有几个(通常少于三个)条目。我的引用率很低 - 也许在大多数情况下在丢弃它们之前我实际上并不引用它们。对于它们来说,HashMap仍然是最好的选择吗?

资源利用不仅仅是速度 - 我希望找到一些不会过度碎片化堆并使垃圾回收需要很长时间的东西。

也许HashMap是正确的答案,但这不是过早优化的情况(或者至少可能不是)。

经过一番思考之后:

我决定手动编写自己的SmallMap。使用AbstractMap可以很容易地创建一个这样的映射。我还添加了一些构造函数,以便可以从现有的Map构建一个SmallMap

在此过程中,我必须决定如何表示Entry并实现entrySet方法的SmallSet

通过编码(和单元测试),我学到了很多,并希望在这里分享,以防其他人需要。它在github上这里

0