【问题标题】:What is the main difference between Array and Hashmap in java? [duplicate]java中Array和Hashmap的主要区别是什么? [复制]
【发布时间】:2018-01-07 19:38:50
【问题描述】:

在Java中,Array和HashMap都是作为集合使用的。但是我不明白什么情况下应该使用Array,什么时候使用HashMap。 两者的主要区别是什么? 我对 Array 和 HashMap 之间的区别感到困惑。

谁能给我解释一下?

【问题讨论】:

  • @ScaryWombat 这个问题似乎是关于HashMap 与数组,而不是ArrayList,所以这并不是真正的重复。
  • @Andreas 抱歉我弄糊涂了
  • OP - 你的意思是像String [] myArr 这样的数组吗?
  • 回答您问题的简单示例是,如果您只想存储一些朋友的姓名,请使用array。如果您想将每个朋友的电话号码与他们的姓名对应起来,请使用HashMap。基本上key,value 对存储在HashMap 中。
  • @ShyamBaitmangalkar 这只是描述了 HashMap 的一种用法,并没有描述他所要求的差异......

标签: java arrays collections hashmap


【解决方案1】:
  • Array 有值,HashMap 有键和值。虽然您可以使用类似array[1] 的方式访问数组中的值,但您不能使用HashMap 来执行此操作。您必须调用 hashmap.get(key) 来检索所需的值(这意味着您需要一个键才能直接访问关联的值)。
  • HashMap 不能有重复的键。因此,如果您有 HashMap 的键和值,则可以确保其键是唯一的(值可能包含键值对中的重复项)。
  • 数组将保持您的顺序,您可以对其进行排序。 HashMap 不保证将使用什么顺序。它也不保证订单会随着时间的推移保持不变。因此,如果您正在寻找它,LinkedHashMap 可能会更好。
  • 虽然需要知道从HashMap 检索值的键,但您也有一个contains(key) 方法,它是O(1) 并具有正确实现的散列。它允许您检查映射中是否存在键。如果您存储相关数据并想检查您是否已经拥有所需的密钥,这将非常有用。

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

另一个消息:如果我没记错的话,HashMaps 在下面使用数组(和LinkedLists)。这是一个非常有用的数据结构,也非常巧妙。

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

【讨论】:

    【解决方案2】:

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

    HashMap 使用键 HashCode 来决定将值存储在 array 中的哪个索引处。当你给一个 HashMap 一个键以获得关联的值时,它会首先计算 key.hashcode() % m,其中 m 是底层数组的长度,然后检查该位置存储的内容。

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

    在每个数组点存储链接列表的需要源于使用 %.哈希码可能非常大,大于数组的大小。这意味着几个不同的键最终可能会生成相同的索引。

    一个很大的区别是时间复杂度。在最坏的情况下,在 HashMap 中查找将花费 O(n) 时间。如果 HashCode 实施不当并且所有项目最终都具有相同的 HashCode,则会发生这种情况。然而,在数组中,查找始终是常数时间 O(1)。

    我希望这能让你更清楚。

    【讨论】:

    • 一般理论答案不够清晰。如果有一些代码 sn-ps 支持,答案会有更多的权重。
    • @ShyamBaitmangalkar 你期待什么,我发布了一个完整的 HashMap 实现?
    • 当然不是。如果您可以添加一些代码 sn-ps 来演示 ArraysHashMap 的行为,答案会很好。这只是一个建议,通常适用于一个人在此论坛上发布的大多数答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 2022-12-03
    • 2021-11-01
    • 2013-07-28
    • 2011-01-27
    • 2013-02-13
    相关资源
    最近更新 更多