如果我的地图需要小到快,我应该使用 Map<K,V> 的哪种实现?

2022-09-01 08:53:02

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

对于这些小型,本地和临时用途来说是否太复杂?在这些情况下,我可以使用另一种简单的实现吗?HashMap<K,V>

我想我正在寻找一个类似于.它存在吗?MapArrayListList


稍后在响应后添加:

这是一个场景,一个缓慢但非常简单的实现可能会更好 - 当我有很多很多这样的实现时。例如,假设我有一百万张左右的这些小地图,每张地图都有少量(通常少于三个)条目。我的参考率很低 - 也许在它们大部分时间被丢弃之前,我实际上并没有引用它们。对他们来说,情况仍然是最好的选择吗?MapHashMap

资源利用率不仅仅是速度 - 例如,我想要一些不会使堆碎片化并使GC花费很长时间的东西。

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


经过一番思考后添加:

我决定手动编写自己的.用 很容易做一个。我还添加了几个构造函数,以便可以从现有的.SmallMapAbstractMapSmallMapMap

在此过程中,我必须决定如何表示s并实现该方法。EntrySmallSetentrySet

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


答案 1

在Java中没有标准的小型实现。 是周围最好和最灵活的实现之一,很难被击败。但是,在非常小的需求区域 - 堆使用率和施工速度至关重要 - 有可能做得更好。MapHashMapMap

我已经在GitHub上实现了SmallCollections来演示如何做到这一点。我很想谈谈我是否成功了。我绝不能确定我有。

虽然这里提供的答案有时是有帮助的,但总的来说,它们往往误解了这一点。无论如何,回答我自己的问题,最终对我来说比得到一个更有用。

这里的问题已经达到了目的,这就是为什么我“自己回答了这个问题”。


答案 2

我认为这是过早的优化。您是否有记忆问题?创建太多地图导致的性能问题?如果不是,我认为HashMap很好。

此外,看看API,我没有看到比.HashMap

如果您遇到问题,可以滚动自己的Map实现,该实现具有非常简单的内部结构。但我怀疑你会比默认的Map实现做得更好,而且你有确保你的新类工作的开销。在这种情况下,您的设计可能存在问题。