Java HashMap vs ArrayList性能我说的对吗

Java HashMap vs ArrayList性能我说的对吗,java,performance,arraylist,hashmap,Java,Performance,Arraylist,Hashmap,我目前认为: 当您需要随机检索项目的结构时,请使用HashMap 当您要按顺序检索项目时(例如使用for循环)-使用ArrayList 我大体上是对的吗?是否存在不正确的情况?一般来说,是的,您是正确的。还有一个组合数据结构,即,提供对任意元素的快速访问以及可预测的排序 然而,值得注意的是,ArrayList和HashMap分别只是List和Map接口的两个实现。每一种的其他实现可能更适合于更具体的需求。例如,对于某些排队/退队要求,LinkedList可能比ArrayList提供更高的性能

我目前认为:

  • 当您需要随机检索项目的结构时,请使用
    HashMap
  • 当您要按顺序检索项目时(例如使用for循环)-使用
    ArrayList

我大体上是对的吗?是否存在不正确的情况?

一般来说,是的,您是正确的。还有一个组合数据结构,即,提供对任意元素的快速访问以及可预测的排序


然而,值得注意的是,ArrayList和HashMap分别只是List和Map接口的两个实现。每一种的其他实现可能更适合于更具体的需求。例如,对于某些排队/退队要求,LinkedList可能比ArrayList提供更高的性能。

对于我来说,更重要的是我是否关心集合中项目的顺序。如果您确实关心顺序,请使用ArrayList。如果您不关心订单(您只想存储一堆项目),那么您可以使用HashMap。

我有点不同意。对我来说,这更多地取决于我想如何检索这些项目。如果我想根据它们的顺序(精确地说是索引)这样做,我倾向于使用线性结构,比如ArrayList(甚至是数组)。如果我需要查找项目,我会使用类似HashMap的映射结构


另一个复杂的因素与插入和顺序有关,正如dan所指出的。

不要忘记,使用映射(如果您有密钥)访问一个特定项目比从数组中访问要快得多(除非您有索引,但一个键将始终为您提供正确的值,而如果插入新元素或删除旧元素,则索引可能不起作用).

我想说您通常是正确的,但并不完全准确。您使用
哈希映射进行数据检索,但并不总是随机的。您使用
数组列表进行迭代,但也可以通过索引进行查找

更一般地说,当您需要通过查找高效地检索项目时,您可以使用
Map
实现,即基于键检索某些内容,例如字典、缓存、存储库等

当您只需要一个可以对数据进行迭代的数据结构时,通常当您需要以预定和/或可预测的顺序对数据进行迭代时,可以使用
列表
实现

换句话说,使用
Map
s作为索引数据结构,使用
List
s作为通常使用的数组。

映射是一个。它有一个键->值布局。另一方面,列表是一个元素的有序集合

一个更直接的比较可能是在集合和列表之间:这两个值都保持着列表的显式顺序(您可以得到元素#x),而集合(通常)没有顺序(除非它是一个,在这种情况下,迭代顺序将由比较器排序)

Set和List最常见的两种实现是HashSet和ArrayList。若要检查元素是否属于ArrayList(包含(元素)),实现将迭代它的所有元素,检查是否使用equals()找到元素要检查一个元素是否属于hashset,首先计算元素的hashCode(),然后“直接”到该元素应该驻留的位置,并检查它是否在那里

因此,ArrayList和HashSet之间的一个显著区别是contains()的速度

在列表中,除了可以对集合执行的操作(添加、删除、询问是否存在(包含)以及迭代所有元素外,还可以请求元素#x

在映射上,您可以通过其键来请求元素,而不是像处理列表那样通过其索引来请求元素


哈希集目前仅通过哈希映射实现,其中不使用键->值关系的值部分。这完全是荒谬的,除了为哈希集中插入的每个和所有元素浪费至少4个字节之外,没有任何用处。

我怀疑链表是否能提供更好的性能。数组access是O(1),就像单链接遍历一样,但我希望引用的局部性在数组中更好,从而得到更好的结果。LinkedList在迭代性能方面并没有明显优于ArrayList。(而且它肯定使用了更多内存!)。但对于某些类型的列表插入和删除操作,它明显更好。是的,我同意插入/删除对于
LinkedList
更好,特别是当用作
Deque
时。我的评论是对“纯迭代性能…”的回应是的,你说得对。我把它与插入和删除的性能混淆了。同样值得注意的是,如果这些集合要通过JPA(或类似Hibernate的ORM)持久化到数据库中,像
LinkedHashMap
这样有用的替代实现无法轻易使用,因为ORM重构集合的方式有限。HashSet我用过一两次来维护一组元素,但这些元素的源不保证是独特的(也就是说,数据流中可能有重复的条目。)使用hashset,可以保证不会有重复的条目(授予equals并正确实现hashcode。)这可能比在列表中测试每个插入操作都包含一个给定的条目更为优化。