HashMap和ArrayList的Java速度比较

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

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

如果您的ID不是基于索引的,而不是基于ArrayList,get将是
O(n)
(您必须迭代元素),而hashmap#get将是
O(1)

如果您只有10个元素,那么您使用什么并不重要。要获得与您的案例相关的结果,最好的方法是自己测试它。也就是说,多达10种元素的元素数量相对较少。除非你多次搜索这10个元素。正如我提到的,会有很多人需要它。这就是为什么我要搜索这些测试的任何资源。我可以做一些简单的时间测量,但在整个系统中,它的行为可能会有所不同。这就是为什么我要问是否有针对Java的分析。我确信我看到了C++集合的讨论。Aleksandr那么在你看来,如果我需要做200-300k搜索,自动装箱不是问题吗?@测试者,你应该提供两个预期用例的代码片段。还有30万次搜索需要多少时间?尽快?马上此外,你问这个问题是因为你遇到了瓶颈还是出于好奇?@Aleksandr一个不适合CPU缓存的对象是很不寻常的,但无论如何,CPU缓存不会加载整个对象,而只加载实际访问数据的缓存线。对于小对象,这甚至可能会影响不属于该对象的内存…速度不是复杂性,OP讨论的不是“足够大的N”,而是大小为4-10的集合。如果元素具有索引访问权限,则毫无疑问。我需要使用不基于索引的ID执行搜索。@测试者,因为您说ID是一个整数,可能它可以映射到列表索引,我们不知道。至少,您可以始终按索引对列表进行排序,并且具有O(logn)时间复杂度。这对多达十种元素来说并不重要…@Holger Yep,bisearch是一种选择。即使Id不是连续的,不能用作直接索引。然而,若这种方法对ArrayList的多重访问比对HashMap的单一访问更快,那个么这个问题仍然适用。看起来我需要做一些盲测试,看看是否有显著差异。我在网上没有找到更多的信息。