我目前认为:
- 当你需要一个结构,从中你会被随机检索项目-使用
HashMap
- 当你将被检索,以便项目(例如,使用一个for循环) -使用
ArrayList
难道我通常是正确的? 是否有情况下这是不正确的?
我目前认为:
HashMap
ArrayList
难道我通常是正确的? 是否有情况下这是不正确的?
一般情况下,是的,你是正确的。 还有一个组合的数据结构,在LinkedHashMap的 ,它提供了对任意元素的快速访问,以及可预测的顺序。
不过,值得注意的是,ArrayList和HashMap的分别只有两个列表和地图接口的实现。 有每一个可能更适合有特殊要求的其他实现。 例如,一个LinkedList可能提供比某些排队/出队要求一个ArrayList更高的性能。
地图是地图,或“关联数组” 。 它有一个键 - >值的布局。 列表是对另一方面一个清单 ,这是元素的有序集合。
更直接的比较就可能会置与列表之间:这两个抱值,其中列表被明令(你可以得到元素#X),并集(通常情况下)不下令(当然,除非它是一个SortedSet的 ,在这种情况下,迭代顺序将由比较器来排序)。
对于设置和列表两种最常见的实现是HashSet的和ArrayList。 要检查如果一个元素在一个ArrayList属于(含有(元件)),执行迭代过的它的所有元素,检查一个是否已经发现使用equals()方法的元素。 要检查是否一个元素在一个HashSet所属第一元素的hashCode()方法进行计算,然后一个变为“直接”到位置该元件应该驻留,并检查它是否是存在的。
因此,ArrayList和HashSet的之间的显著差的速度含有()。
在列表中,你可以要求元素#X,除了可以在一组,这是添加,删除,请问,是否存在的(包含)做什么,以及遍历所有元素。
在地图上,你可以通过它的索引,你有一个清单做要求其键的元素,而不是。
一个HashSet目前由其中不使用键- >值的关系的值部分一个HashMap简单地实现。 这完全是荒谬的,没有任何使用其他不是浪费至少4个字节,就可以说12,为每一位和插入HashSet的所有元素。
我要说的是,你通常是正确的,但不能完全准确。 您可以使用一个HashMap
进行数据检索,但并不总是随意。 您可以使用一个ArrayList
迭代,但你也可以通过索引用它来查找。
更一般地,你用Map
实现时,你需要有效地检索由查询,例如项目检索基础上,关键的东西-如字典,高速缓存,信息库等。
您可以使用一个List
实现时,你只想要一个数据结构,其中,当你希望他们在预定的和/或可预测的顺序,你可以遍历数据,通常。
换句话说,你可以使用Map
S作为索引数据结构,并使用List
S作为你通常会使用数组。
对我来说,它更我是否关心集合中的项目的顺序。 如果你关心的顺序,然后使用ArrayList的。 如果你不关心顺序(你只是想保存一堆物品的),那么你可以使用HashMap。
不要忘记它也快得多去一个特定项目与地图(如果你有钥匙),比它从一个数组(除非你有一个指标,但关键的总是会得到你正确的值,而具有如果新元素插入或旧的删除)指数可能无法正常工作。
我有点不同意。 对我来说,更多地取决于我多么想取回物品。 如果我想基于像他们为了做到这一点(通过索引,要准确)我会倾向于使用线性结构像一个ArrayList(甚至数组)。 如果我需要查找的物品,我会使用一个映射结构如HashMap。
另一个复杂的因素有做插入和秩序,丹指出。