HashMap vs ArrayList 性能是我正确的
我目前认为:
- 当您需要一个结构来随机检索项目时 - 使用
HashMap
- 当您按顺序检索项目时(例如,使用 for 循环) - 使用
ArrayList
我一般是对的吗?是否存在不正确的情况?
我目前认为:
HashMap
ArrayList
我一般是对的吗?是否存在不正确的情况?
映射是映射,或“关联数组”。它具有键值>布局。另一方面,列表是一个列表,它是元素的有序集合。
更直接的比较可能是在 Set 和 List 之间:这两个保持值,其中列表是显式排序的(您可以获得元素 # x),并且集合(通常)不排序(好吧,除非它是 SortedSet,在这种情况下,迭代顺序将由比较器排序)。
Set 和 List 的两个最常见的实现是 HashSet 和 ArrayList。为了检查某个元素是否属于数组列表(contains(element)),实现将循环访问它的所有元素,并使用 equals() 方法检查是否已找到该元素。要检查元素是否属于哈希集,首先计算元素的hashCode(),然后“直接”到该元素应驻留的位置,并检查它是否在那里。
因此,ArrayList 和 HashSet 之间的显著区别是 contains() 的速度。
在列表中,除了可以对集合执行的操作之外,还可以请求 element# x,即添加、删除、询问是否存在(包含)和迭代所有元素。
在地图上,您可以按元素的键(而不是像使用列表那样按其索引)来请求元素。
HashSet目前仅由HashMap实现,其中不使用键>值关系的值部分。这完全是荒谬的,除了浪费至少4个字节之外没有任何用处,对于插入HashSet中的每个元素,可以说是12个字节。
一般来说,是的,你是对的。还有一个组合的数据结构,LinkedHashMap,它提供了对任意元素的快速访问以及可预测的排序。
但是,值得注意的是,ArrayList 和 HashMap 分别只是 List 和 Map 接口的两个实现。每种方法还有其他实现可能更适合更具体的要求。例如,对于某些排队/取消排队要求,LinkedList 可能比 ArrayList 提供更高的性能。