【问题标题】:Iterator VS HashMap<String, Object> in JAVAJAVA 中的迭代器 VS HashMap<String, Object>
【发布时间】:2015-08-30 13:03:05
【问题描述】:

假设我们有一个项目集合。两者哪个更快?

HashMap<String, ObjectFoo> hashmap = new HashMap<String, ObjectFoo>();
/* .... add elements .... */
ObjectFoo theElement = hashmap.get("nameOfObject");

或者

ArrayList<ObjectFoo> arraylist = new ArrayList<Object>();
/* .... add elements .... */
Iterator<ObjectFoo> itFoo = arraylist.iterator();
ObjectFoo obj;
while(itFoo.hasNext()) {
  obj = itFoo.next();
  if (obj.name.equals("nameOfObject")) return obj;
}

假设:

public class ObjectFoo {
  public String name;
}

【问题讨论】:

  • 哈希表存在的唯一原因是随机访问的速度。所以猜一猜。

标签: java iterator hashmap


【解决方案1】:

HashMap(几乎总是)更快。如果你知道Big O notation 然后使用 HashMap 是 O(1) 而使用(未排序的)ArrayList 是 O(n)

【讨论】:

    【解决方案2】:

    HashMap 根据 key 的 hashcode 将 key-value paris 存储在桶中。存储桶是用数组组织的,访问数组是O(1)

    因此,当您调用hashmap.get("nameOfObject"); 时,它会计算键的哈希码,然后选择包含对的元素的桶,其中键的哈希码与用作参数的键的哈希码相同。

    有时会有更多的键值对具有相同的哈希码。在这种情况下,map 需要遍历它们并检查我们的键是否等于该对中的键,但是由于具有相同哈希码的元素数量非常少,因此迭代它们比迭代存储在 map 中的所有元素要快得多。

    【讨论】:

      猜你喜欢
      • 2015-04-13
      • 1970-01-01
      • 2016-06-11
      • 2015-09-19
      • 2011-12-02
      • 1970-01-01
      • 2018-05-20
      • 2017-11-01
      • 2014-07-20
      相关资源
      最近更新 更多