java中Array和Hashmap的主要区别是什么?

时间:2017-08-01 05:05:20

标签: java arrays collections hashmap

在Java中,Array和HashMap用作集合。但是我无法理解在哪些情况下我们应该使用Array以及使用HashMap的时间。 两者之间的主要区别是什么? 我对Array和HashMap之间的区别感到困惑。

任何人都可以向我解释这个吗?

2 个答案:

答案 0 :(得分:1)

  • Array包含值,HashMap包含键和值。虽然您将使用array[1]之类的内容访问数组中的值,但您无法使用HashMap执行此操作。您必须调用hashmap.get(key)来检索所需的值(这意味着您需要一个键才能直接访问相关值)。
  • HashMaps不能有重复键。因此,如果您有HashMap个键和值,则可以确保其键是唯一的(值可能包含键值对的重复项。)
  • 阵列将维护您的订单,您可以对它们进行排序。 HashMap不保证将使用的订单。它也不能保证订单会随着时间的推移保持不变。因此,如果您正在寻找它,最好使用LinkedHashMap
  • 虽然有必要知道从HashMap检索值的密钥,但您还有一个contains(key)方法,它是O(1),具有正确实现的哈希值。它允许您检查地图中是否存在密钥。如果您存储相关数据并想要检查是否已有所需的密钥,这非常有用。

他们两者的共同点是,get和put操作都是(在理想情况下)O(1)。

另一个信息:如果我没弄错的话,HashMap会使用下面的数组(和LinkedList s)。它是一个非常有用的数据结构,并且非常巧妙。

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

答案 1 :(得分:1)

假设您完全了解HashMap处理键值对而数组不处理的事实..

HashMap使用键 HashCode 来决定将值存储在数组中的索引。当您为HashMap提供一个键以获取相关值时,它将首先计算key.hashcode()%m,其中m是底层数组的长度,然后检查存储在该位置的内容。

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

在每个数组中存储Linkedlists的需要源于使用%。哈希码可能非常大,大于数组的大小。这意味着几个不同的密钥最终可能会生成相同的索引。

一个很大的不同是时间的复杂性。在最坏的情况下,在HashMap中查找将花费O(n)时间。如果HashCode实现不佳并且所有项目都以相同的HashCode结束,则会发生这种情况。但是,在数组中,查找始终是常量时间O(1)。

我希望这会让你更清楚。