`
jiangzhenghua
  • 浏览: 602670 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

遍历HashMap的两种方法及效率

 
阅读更多

第一种:
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
    Map.Entry entry = (Map.Entry) iter.next();
    Object key = entry.getKey();
    Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
第二种:
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
    Object key = iter.next();
    Object val = map.get(key);
}
效率低,以后尽量少使用!

例:
HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例:

public class HashMapTest {
public static void main(String[] args) ...{
  HashMap hashmap = new HashMap();
  for (int i = 0; i < 1000; i ) ...{
   hashmap.put("" i, "thanks");
  }

  long bs = Calendar.getInstance().getTimeInMillis();
  Iterator iterator = hashmap.keySet().iterator(); 
  while (iterator.hasNext()) ...{  
   System.out.print(hashmap.get(iterator.next()));
  }
  System.out.println();
  System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
  listHashMap();
}

  public static void listHashMap() ...{
  java.util.HashMap hashmap = new java.util.HashMap();
  for (int i = 0; i < 1000; i ) ...{
   hashmap.put("" i, "thanks");
  }
  long bs = Calendar.getInstance().getTimeInMillis(); 
  java.util.Iterator it = hashmap.entrySet().iterator();
  while (it.hasNext()) ...{
   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
   // entry.getKey() 返回与此项对应的键
   // entry.getValue() 返回与此项对应的值
   System.out.print(entry.getValue());
  }
  System.out.println();
  System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
}
}

对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。

到底keyset快还是entryset快,这个例子输出太多影响效果,改一下例子。

Java代码 复制代码
  1. public class HashMapTest {       
  2.     private static int MAXKEY = 1234567;   
  3.     public static void main(String[] args) {   
  4.         HashMap hashmap = new HashMap();   
  5.         for (int i = 0; i < HashMapTest.MAXKEY; i++) {   
  6.             hashmap.put(i, "thanks");   
  7.         }   
  8.         long bs = Calendar.getInstance().getTimeInMillis();   
  9.         Iterator iterator = hashmap.keySet().iterator();   
  10.         while (iterator.hasNext()) {   
  11.             Object key = iterator.next();   
  12.             Object value = hashmap.get(key);   
  13.         }   
  14.         System.out.print(Calendar.getInstance().getTimeInMillis() - bs + ",");   
  15.         listHashMap();   
  16.     }   
  17.   
  18.     public static void listHashMap() {   
  19.         HashMap hashmap = new java.util.HashMap();   
  20.         for (int i = 0; i < HashMapTest.MAXKEY; i++) {   
  21.             hashmap.put(i, "thanks");   
  22.         }   
  23.         long bs = Calendar.getInstance().getTimeInMillis();   
  24.         Iterator it = hashmap.entrySet().iterator();   
  25.         Map.Entry entry;   
  26.         while (it.hasNext()) {   
  27.             entry = (java.util.Map.Entry) it.next();   
  28.             Object key = entry.getKey();   
  29.             Object value = entry.getValue();   
  30.             //Object value = hashmap.get(key);   
  31.         }   
  32.         System.out.print(Calendar.getInstance().getTimeInMillis() - bs);   
  33.     }   
  34. }  
public class HashMapTest { private static int MAXKEY = 1234567; public static void main(String[] args {


    /*
     * 先来测测,i为1234567时,输出 63,47  47,47  63,47 测了三次
     * 改一下代码,listHashMap方法的while循环中,Object value = hashmap.get(key)
     * 再测,63,79  47,78  63,79  三次
     */
keySet比entrySet慢吗?
keySet第一次遍历获得所有key,entrySet第一次遍历获得所有key和value,这一步显然entrySet会慢,看下一步。
iterator之后,keySet的next()是key,entrySet的next()是Map.Entry(包含了key和value)。
改变代码之后的测试表明,entrySet的getValue()比Map的get()确实快(虽然不知道它们内部是怎样的原理实现,虽然有人说Map的get()消耗很小)。当然,没有理由使用更改后的代码,别误导了。
于是,我想entrySet()貌似是快一些,把第一次遍历的获得同时得到key和value多花的时间抢回来了。

不过要按key排序的话,似乎keySet更方便一些。

Java代码 复制代码
  1. Object[] key_arr = hashmap.keySet().toArray();   
  2. Arrays.sort(key_arr);   
  3. for (Object key : key_arr) {   
  4.     Object value = hashmap.get(key);   
  5. }  
分享到:
评论

相关推荐

    map遍历的四种方式及性能比较

    此外,使用`Iterator`可以在遍历过程中安全地删除元素,而其他两种方式无法做到这一点。从性能上看,该方法与使用增强for循环遍历`keys`或`values`(方法二)具有相似的表现。 #### 方法四:通过键查找值遍历 这种...

    Java HashMap的三种遍历方法及优缺点含示例

    通过entrySet()方法,我们可以遍历HashMap中的每个键值对(Entry)。这种方式不仅可以遍历到所有的键,还可以在单次遍历中直接获得与键相对应的值。对于需要同时处理键和值的场景,entrySet()是最为高效的方法。 **...

    java中Map的两种遍历方法

    本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...

    HashMap遍历

    本文将深入探讨`HashMap`的遍历方法,包括`keySet()`和`entrySet()`两种主要方式,并通过代码示例对比它们的性能差异。 #### 方法一:使用`keySet()`遍历 `keySet()`方法返回`HashMap`中的所有键的集合视图。通过...

    HashMap和链表的查找效率比较

    在Java编程语言中,`HashMap`和`List`(通常指的是`ArrayList`或`LinkedList`)是两种常用的数据结构,它们各自在不同的场景下有着不同的性能优势。本工程通过`VS2013`(Visual Studio 2013,虽然它主要用于C++开发...

    如何得到hashmap的索引

    #### 遍历HashMap的方法 根据提供的内容,我们可以了解到遍历`HashMap`主要有两种方式:使用`keySet()`方法和使用`entrySet()`方法。 1. **使用keySet()方法** ```java Map map = new HashMap(); Iterator ...

    JAVA遍历Map所有元素.doc

    在上述的`HashMapTest`类中,通过对比`keySet()`和`entrySet()`遍历HashMap的时间,我们可以看到`entrySet()`方法通常比`keySet()`方法更快。`keySet()`需要两次遍历:一次是转换为迭代器,另一次是从HashMap中根据...

    hashmap使用实例

    6. **遍历HashMap**:有两种方式遍历HashMap,一是通过`entrySet()`获取键值对的迭代器,二是通过`keySet()`获取键的迭代器再获取对应的值。 ```java for (Map.Entry, String&gt; entry : map.entrySet()) { System....

    HashMap的数据结构

    6. **迭代性能**:由于HashMap使用链表解决哈希碰撞,如果某个哈希桶内的链表过长(例如,出现大量键的哈希码冲突),那么在遍历HashMap时,性能会下降到接近于O(n),其中n是链表的长度。 7. **键的唯一性**:...

    hashmap 实例

    总结来说,HashMap 提供了快速的键值对存储和查找,但在遍历操作中需要注意效率。选择数据结构时,应考虑是否需要线程安全、是否频繁插入/删除、以及访问模式等因素。在多线程环境下,若需保证线程安全,可以考虑...

    java HashMap原理分析

    2. collisions处理:当两个不同的Key发生哈希碰撞时,HashMap会将它们存储在同一个链表中,在查找时,HashMap会遍历链表,找到符合条件的Entry对象。 HashMap的查询效率非常高,因为它可以通过哈希函数直接定位到...

    Java HashMap两种简便排序方法解析

    Java HashMap两种简便排序方法解析 Java HashMap是一种常用的数据结构,然而,它的储存是没有顺序的,按照key的HashCode实现。这使得在 certainsituations下的排序变得非常重要。下面,我们将介绍两种简便的排序...

    js 版 java hashmap

    2. **开放寻址法与链地址法**:解决哈希冲突的方法主要有两种。开放寻址法是当冲突发生时,寻找下一个空的哈希槽,直到找到为止;链地址法则是每个哈希桶维护一个链表,冲突的键会被添加到同一个桶的链表中。...

    delphi hashmap集合

    - 不保证顺序:插入元素的顺序不一定会反映在迭代遍历HashMap时的顺序,除非特别设计的哈希函数。 2. **使用HashMap:** - **创建HashMap:** Delphi中,你可以使用TDictionary类来创建一个HashMap实例,例如 `...

    HashMap介绍和使用

    所有的复杂数据结构都可以基于这两种基本结构构建出来,HashMap也不例外。 **1.1 数组和链表结合** HashMap内部采用数组加链表(或红黑树)的形式存储数据,这种结构称为“链表散列”。数组作为主存储结构,而链表...

    如何遍历一个java集合

    遍历HashMap时,可以使用`keySet()`、`values()`或`entrySet()`方法获取相应的Set视图,再进行迭代。 在面试中,除了基本的遍历方式,还可能考察一些高级话题,如并发遍历(ConcurrentModificationException)、...

    Map遍历方法

    本文将详细介绍几种常见的`Map`遍历方法,并解释每种方法的特点和适用场景。 #### 二、Map遍历方法概述 `Map`提供了多种遍历其内部元素的方式。其中,最常用的是通过`keySet()`、`entrySet()`以及`values()`等方法...

    java遍历大容量map的正确方法.pdf

    它不提供直接的key访问,因此在大多数情况下不如前两种方法实用。 ```java for (String v : map.values()) { System.out.println("value= " + v); } ``` 对于大容量的Map,推荐使用第三种方式,即通过Map....

    关于如何解决HashMap线程安全问题的介绍

    在多线程环境下,两个线程同时触发扩容可能导致循环链表的形成,从而引发死循环,这是一种严重的性能问题。 为了解决HashMap的线程不安全问题,我们可以采取以下几种策略: 1. 使用Collections.synchronizedMap()...

Global site tag (gtag.js) - Google Analytics