2017-08-01 123 views
-6

在Java中,Array和HashMap被用作集合。但是我无法理解在哪种情况下我们应该使用Array以及何时使用HashMap。 他们俩之间的主要区别是什么? 我对数组和HashMap之间的区别感到困惑。java中的Array和Hashmap之间的主要区别是什么?

任何人都可以解释这一点吗?

+1

@ScaryWombat这个问题似乎是关于'HashMap'与数组,而不是'ArrayList',所以这不是真正的重复。 – Andreas

+0

@Andreas对不起,我感到困惑 –

+0

OP - 你的意思是一个像'String [] myArr'这样的数组吗? –

回答

0
  • Array具有值,HashMap具有键和值。而您可以通过类似array[1]的值访问某个值,但您无法通过HashMap来完成此操作。您必须致电hashmap.get(key)以检索所需的值(这意味着您需要一个密钥才能直接访问关联的值)。
  • HashMaps不能有重复键。因此,如果您有键和值的HashMap,则可以确定它的键是唯一的(值可能包含键值对中的重复项)。
  • 数组将维持您的订单,您可以对它们进行排序。 HashMap不保证使用什么订单。它也不保证订单会随着时间的推移保持不变。所以如果你正在寻找它,你可能会更好LinkedHashMap
  • 虽然有必要知道从HashMap中检索值的密钥,但您也有一个contains(key)方法,该方法是具有正确实施的散列的O(1)。它允许您检查地图中是否存在关键字。如果您存储关联的数据并且想要检查您是否已经拥有了所需的关键字,则这非常有用。

它们之间有什么共同之处在于get和put操作都是(在理想情况下)O(1)。

信息的另一个小窍门:如果我没有弄错,HashMap s利用阵列(和LinkedList s)在下面。这是一个非常有用的数据结构,并且非常巧妙。

在想要将两段数据相互关联的情况下,您希望使用HashMaps。说,你有一个Restaurant和一个Address。你可以使用Restaurant作为键,Address作为一个值(不是最好的例子,但你明白了)。至于阵列,如果你有一个你最喜欢的餐馆的列表,数组可能是一个很好的选择,以保持他们。

0

假设你完全清楚的是一个HashMap处理键值对,而数组没有事实..

一个HashMap使用键的hashCode在什么索引值存储在一个决定array。当你给HashMap一个键值以获取相关值时,它将首先计算key.hashcode()& m,其中m是底层数组的长度,然后检查存储在该位置的内容。

HashMap的一个实现可能会在每个数组点处存储链接列表。如果是这种情况,HashMap现在将遍历列表并返回一个值v,如果相关的密钥和您提供的密钥相同(由等于()方法确定)。

需要在每个数组池中存储Linkedlist出现于使用%。散列码可能非常大,大于数组的大小。这意味着几个不同的键最终可能会生成相同的索引。

一个很大的区别是时间复杂性。在最坏的情况下,HashMap中的查找将花费O(n)次。如果HashCode执行得不好并且所有项目都以相同的HashCode结束,就会发生这种情况。然而,在一个数组中,查找总是时间为O(1)。

我希望这可以让你更清楚一些。

+0

一般理论上的答案不够清晰。如果由一些代码片段支持,答案会有更多的权重年龄。 –

+0

@ShyamBaitmangalkar你期望什么,我发布了一个HashMap的完整实现? –

+0

当然不是。如果你可以添加一些代码片段来证明'Arrays'和'HashMap'的行为,那么答案会很好。这只是一个建议,通常适用于本论坛发布的大部分答案。 –

相关问题