使用带有整数(索引)作为键的 HashMap 与使用 ArrayList

Using HashMap with Integers ( indices ) as keys vs using an ArrayList

所以我目前正在 Java 复制我自己的口袋妖怪版本。我最近才熟悉更高级的数据结构,我仍然不确定什么时候应该比另一个更合适。

基本上,我想存储一个 Pokedex(Pokemon 的数据库),而 HashMap 似乎是最合适的。键是 Pokemon 的 pokedex # ,值是相关的 Pokemon 对象。但是,由于图鉴的性质,这意味着每个神奇宝贝的图鉴 # 只是它们在图鉴中的各自索引。

我的问题是,当键只是索引值时使用 HashMap 是否有意义,或者将 Pokedex 存储为 ArrayList(或什至数组)是否更有意义,其中每个 Pokemon 都存储在其各自的位置指数?

显然,如果我还没有为每个口袋妖怪创建定义,那么 ArrayList 的内存效率将很低,因为我们必须为每个口袋妖怪保留 space,但据我所知,哈希图中的键是应该用于创建哈希值而不是直接索引吗?还是无论如何都合适?

这真的取决于。地图为您提供了更高的自由度,而 lists/arrays 可能会迫使您承担使用此类 linear/sequential 数据结构的后果。

然后,这取决于 "sparse" 您的数组的填充方式。如果 "keys" 运行 0 到 1000,有很少或没有未使用的插槽,列表就可以了。如果键从 0 到 1000 万,并且大多数槽都是空的:使用映射。或者针对稀疏矩阵优化的数据结构。

除此之外,请记住数组不包含对象本身的内存,仅包含指向它们的引用。所以数组的内存占用是相同的,无论槽是空的还是指向某处。

您使用 Hashmap 的第一直觉是正确的。 尽管数组效率更高,但在您的情况下这种效率毫无意义。 在 pokedex 中查找 pokemon 将是您的程序所做的最耗时的事情之一;优化它是没有意义的,甚至可能无意中引入错误(例如,差一错误)