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

Java 使用带有整数(索引)的HashMap作为键与使用ArrayList,java,arraylist,data-structures,hashmap,indices,Java,Arraylist,Data Structures,Hashmap,Indices,所以我现在正在用Java复制我自己的口袋妖怪版本。我最近才熟悉了更高级的数据结构,但我仍然不确定哪种结构更合适 基本上,我想存储一个Pokedex(Pokemon的数据库),而HashMap似乎是最合适的。密钥将是口袋妖怪的pokedex#,值将是有问题的口袋妖怪对象。但是由于pokedex的性质,这意味着每个口袋妖怪的pokedex将只是pokedex中各自的索引 我的问题是,当键只是索引值时,使用HashMap是否有意义,或者将Pokedex存储为ArrayList(甚至是数组)是否更有意义

所以我现在正在用Java复制我自己的口袋妖怪版本。我最近才熟悉了更高级的数据结构,但我仍然不确定哪种结构更合适

基本上,我想存储一个Pokedex(Pokemon的数据库),而HashMap似乎是最合适的。密钥将是口袋妖怪的pokedex#,值将是有问题的口袋妖怪对象。但是由于pokedex的性质,这意味着每个口袋妖怪的pokedex将只是pokedex中各自的索引

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


显然,如果我还没有为每个口袋妖怪创建定义,那么ArrayList将是内存效率低下的,因为我们必须为每个口袋妖怪保留空间,但据我所知,hashmaps中的键应该用于创建哈希值,而不是直接索引,对吗?或者不管怎样都合适吗?

这要看情况而定。地图为您提供了更高的自由度,而列表/数组可能会迫使您承担使用此类线性/顺序数据结构的后果

然后,这取决于数组的“稀疏”程度。如果“键”运行在0到1000之间,没有或很少有未使用的插槽,则可以列出一个列表。如果钥匙转到0到1000万,而大多数插槽为空:使用地图。或者为稀疏矩阵优化的数据结构


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

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

将只是它们各自的索引-如果这在将来可能发生变化,请使用
哈希映射
,否则请使用
数组列表
。如果键始终为0、1、2。。。使用列表。但是,如果键不规则,请使用hashmap。老实说,在大多数情况下,您可以只使用hashmap而不会遇到任何问题。除非有很多关键点冲突,否则查找速度非常快。“软件工程中最难的三件事是命名和按一个错误进行筛选”。