【问题标题】:Java speed comparison between HashMap and ArrayListHashMap 和 ArrayList 的 Java 速度比较
【发布时间】:2020-05-26 00:55:10
【问题描述】:

我想知道 Hashmap 和 ArrayList 中的搜索元素之间是否有任何比较。我遇到的情况如下:我将有少量元素(通常 4-6 可能最多 10)。我有这样的元素的整数 Id,我会得到很多调用,这些调用将使用 id 搜索元素并在这个元素上执行一些方法。 它看起来像是 hashmap 的好用例,但是我开始怀疑像 ArrayList 这样的线性集合在这里是否会更好。例如因为 CPU 缓存。而且要在地图上使用搜索,我需要自动装箱以从原始创建整数。 问题是对于这种情况,更好的是对原始整数进行线性搜索和比较,还是坚持使用 hashmap?

【问题讨论】:

  • 如果你只有10个元素,用什么都没关系
  • 获得与您的案例相关的结果的最佳方法是自己进行测试。话虽如此,最多 10 个 元素是相对较少的元素。除非您多次搜索这 10 个元素。
  • 正如我所提到的,会有很多人要求它。这就是为什么我正在搜索任何资源以进行此类测试。我可以做一些简单的时间测量,但在整个系统中它的行为可能会有所不同。这就是为什么我要问是否有任何针对 Java 的分析。我很确定我看到了有关 C++ 集合的此类讨论。 @Aleksandr 所以在您看来,如果我需要进行 200-300k 搜索自动装箱不是问题?
  • @TheTosters 您应该提供两个预期用例的代码 sn-p。还有 30 万次搜索需要多少时间?尽早?在一分钟内?此外,您问这个是因为遇到瓶颈还是出于好奇?
  • @Aleksandr 一个不适合 CPU 缓存的对象是相当不寻常的,但无论如何,CPU 缓存不会加载整个对象,而只会加载实际访问数据的缓存行。对于小对象,这甚至可能会影响不属于该对象的内存……

标签: java performance arraylist collections hashmap


【解决方案1】:

如果您的 id 不是基于索引的,则 ArrayList#get 将是 O(n)(您必须遍历元素),而 HashMap#get 将是 O(1)

【讨论】:

  • 速度不是复杂性,OP不是在讨论“足够大的N”而是一个4-10大小的集合。
  • 如果元素将具有索引访问权限,则毫无疑问。我需要使用不基于索引的 ID 执行搜索。
  • @TheTosters 既然你说ID是一个整数,它可能会映射到一个列表索引,我们不知道。至少,您始终可以按索引对列表进行排序并具有 O(log n) 时间复杂度。对于最多十个元素来说,这并不重要……
  • @Holger 是的,bisearch 是一种选择。即使 Id 不连续,也不能用作直接索引。但是,如果这种方法对 ArrayList 的多次访问比对 HashMap 的单一访问更快,那么问题仍然存在。看起来我只需要进行盲测,看看是否有任何显着差异。我没有在网上找到更多信息。
猜你喜欢
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 2011-12-16
  • 1970-01-01
相关资源
最近更新 更多