0

可能重复:
何时在 LinkedList 或 ArrayList 上使用 HashMap,反之亦然

自从Maps接触 Java 以来,我一直在广泛使用它们。尤其HashMap是许多场景的绝佳选择。似乎它ArrayList在每个类别中都胜过一个 - 有人说迭代是不可预测的,但为此我们有LinkedHashMap.

所以,我的问题是:HashMap如果我们有一个可靠的不可变密钥,为什么不一直使用 a 呢?

此外,对于非常少量(<10)的项目使用类似 a 是否合适,HashMap或者是否有一些我不考虑的额外开销?

4

3 回答 3

1

ArrayList当您的键是连续整数时使用。(如果它们不是基于 0,只需使用偏移量。)访问(特别是随机访问)和更新效率更高。否则,当然,HashMap(或者,正如你所说,LinkedHashMap)是非常有用的数据结构。

我相信 a 的默认初始大小HashMap是 16 个存储桶,因此对于非常小的列表会有一些开销。但是,除非您要创建大量地图,否则它不应该成为您编码的一个因素。

于 2012-11-05T02:17:39.527 回答
1

与数组(或 ArrayList)相比,HashMap 的开销很大:

  • 您需要对 key 进行哈希处理以获取支持数组的索引,然后存储 value和 key。这比数组更慢并且使用更多的内存。当您的密钥较大或复杂时,这一点更为重要,因为散列需要更长的时间或占用更多空间。
  • 每次查找值时,您还需要对键进行哈希处理。
  • 当您调整 ArrayList 的大小时,您只需创建一个新数组并复制所有内容。当您调整 HashMap 的大小时,您会创建一个新数组,然后重新计算哈希值(因此它们将通过新数组展开)。
  • HashMap 在满时性能很差,因此它们通常会留出大约 25% 的空间为空。

这些都是很小的,所以你可以一直使用 HashMaps (事实上,这就是 PHP 似乎做的),但是当你真的不需要它时使用 HashMap 是浪费的。

比较可能会有所帮助:你可以用整数做任何事情,你也可以用字符串做任何事情,那么为什么我们有整数呢?因为它们更小,使用起来更快(并提供了一些很好的保证,比如它们总是包含一个数字)。

于 2012-11-05T02:19:47.933 回答
1

我一直在使用地图——它是最强大和最通用的数据结构之一。我主要使用 LinkedHashMap,但是当使用字符串作为键时,我使用 TreeMap,因为对键进行排序有额外的好处。

然而:

  • 如果您的键是 int 并且您计划使用所有键 0..n,请使用数组(请记住 - int 比 Integer 更有效)。但是如果你有“稀疏值”,地图会更好
  • 如果您需要未索引项目的列表,请使用链接列表
  • 如果您需要存储唯一元素,请使用集合(如果您只需要键,为什么要浪费空间来保留值)!

请记住——Java 为您提供了非常强大的集合(Set、Map、List),并且对于每一个集合,具有不同特性的多个实现——它们的存在是有原因的。

每个数据结构都有其用途,即使许多可以使用地图作为后端来实现,最合适的数据结构......更合适(并且通常更有效,开销更少并提供更多功能)

大小无关紧要 - 5 或 500 个元素,如果它看起来像地图,请使用地图(可能很少有例外和极端情况,您需要最大效率并且硬编码值更好)。但如果它看起来像一套 - 使用一套!

于 2012-11-05T02:21:34.960 回答