JAVA - HashMap迭代

1.通过构造HashMap的entrySet来迭代

public class TestUnit {
    public static void main(String[] args){
        HashMap hashMap=new HashMap<Integer,String>();

        hashMap.put(1,"aaa");
        hashMap.put(2,"bbb");
        hashMap.put(3,"ccc");

        Iterator iter=hashMap.entrySet().iterator();
        while(iter.hasNext()){
            Map.Entry mapEntry=(Map.Entry) iter.next();
            Object key=mapEntry.getKey();
            Object value=mapEntry.getValue();
            System.out.println("key="+key+",value="+value);
        }
    }
}

2.先取得HashMap的keySet,再用get(key)访问

if(hashMap!=null || !hashMap.isEmpty()){
            Set set=hashMap.keySet();
            Iterator iter=set.iterator();
            while(iter.hasNext()){
                Object key=iter.next();
                Object value=hashMap.get(key);
                System.out.println("key="+key+",value="+value);
            }
        }

Test

据说是用entrySet更快一点,写段代码测试了一下,确实如此。

public class TestUnit {

    public static void main(String[] args) {
        HashMap<Integer, String> hashMap = new HashMap();
        for (int i = 0; i < 1000; i++) {
            hashMap.put(i, "Hello World!");
        }

        keySetTest(hashMap);
        entrySetTest(hashMap);

    }

    static void keySetTest(Map map) {
        long startTime = Calendar.getInstance().getTimeInMillis();

        Iterator iter = map.keySet().iterator();
        while (iter.hasNext()) {
            System.out.print(map.get(iter.next()));
        }

        long endTime = Calendar.getInstance().getTimeInMillis();

        System.out.println("\nkeySetTest : " + (endTime - startTime)); // 60 ms
    }

    static void entrySetTest(Map map) {
        long startTime = Calendar.getInstance().getTimeInMillis();

        Iterator iter = map.entrySet().iterator();
        Map.Entry mapEntry;
        while (iter.hasNext()) {
            mapEntry = (Map.Entry) iter.next();
            System.out.print(mapEntry.getValue());
        }

        long endTime = Calendar.getInstance().getTimeInMillis();

        System.out.println("\nentrySetTest : " + (endTime - startTime)); // 13 ms
    }
}

原因分析:

  • 使用keySet方法访问时,构建的Set只由key组成,访问每一个value时要重新计算Hash值然后根据Hash值到Map中查找value;
  • 使用entrySet方法访问时,构建的Set直接由<key,value>组成,访问每一个value时直接取就行,无需计算Hash值。
时间: 2024-10-09 13:45:07

JAVA - HashMap迭代的相关文章

Java HashMap拾遗

Java HashMap拾遗 @author ixenos 零碎知识 尽量返回接口而非实际的类型,如返回List.Set.Map而非ArrayList.HashSet.HashMap,便于更换数据结构,而客户端代码不用改变.这就是针对抽象编程 Map.entrySet 方法返回Map映射的 Set 视图Set<Map.Entry<K,V>>,维护entry键值对 该 set 受Map映射支持,所以对Map映射的更改可在此 set 中反映出来,反之亦然! 如果对该 set 进行迭代的

[翻译]Java HashMap工作原理

大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.HashMap的大量源代码(包括Java 7 和Java 8),来深入理解这个基础的数据结构.在这篇文章中,我会解释java.util.HashMap的实现,描述Java 8实现中添加的新特性,并讨论性能.内存以及使用HashMap时的一些已知问题. 内部存储 Java HashMap类实现了Map<K

【转】Java HashMap工作原理(好文章)

大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.HashMap的大量源代码(包括Java 7 和Java 8),来深入理解这个基础的数据结构.在这篇文章中,我会解释java.util.HashMap的实现,描述Java 8实现中添加的新特性,并讨论性能.内存以及使用HashMap时的一些已知问题. 内部存储 Java HashMap类实现了Map<K

【转】Java HashMap 源码解析(好文章)

- .fluid-width-video-wrapper { width: 100%; position: relative; padding: 0; } .fluid-width-video-wrapper iframe, .fluid-width-video-wrapper object, .fluid-width-video-wrapper embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } [

Java HashMap工作原理

内部存储 Java HashMap类实现了Map<K, V>接口.这个接口中的主要方法包括: V put(K key, V value) V get(Object key) V remove(Object key) Boolean containsKey(Object key) HashMap使用了一个内部类Entry<K, V>来存储数据.这个内部类是一个简单的键值对,并带有额外两个数据: 一个指向其他入口(译者注:引用对象)的引用,这样HashMap可以存储类似链接列表这样的对

java集合框架之java HashMap代码解析

 java集合框架之java HashMap代码解析 文章Java集合框架综述后,具体集合类的代码,首先以既熟悉又陌生的HashMap开始. 源自http://www.codeceo.com/article/java-hashmap-java-collection.html 签名(signature) public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Se

Java HashMap工作原理深入探讨

大部分Java开发者都在使用Map,特别是HashMap.HashMap是一种简单但强大的方式去存储和获取数据.但有多少开发者知道HashMap内部如何工作呢?几天前,我阅读了java.util.HashMap的大量源代码(包括Java 7 和Java 8),来深入理解这个基础的数据结构.在这篇文章中,我会解释java.util.HashMap的实现,描述Java 8实现中添加的新特性,并讨论性能.内存以及使用HashMap时的一些已知问题. 内部存储 Java HashMap类实现了Map<K

Java HashMap遍历实践

在原始记忆中,Java HashMap遍历,无非是for each或者iterator,但至于在遍历时性能如何,优缺点如何,泛泛而不得知.对于这样的基础问题,对于王二(Java编程6年,幸好我的方向不是编程)我来说,似乎羞于提及,但事实证明,我还必须"积硅步". ①方法一.iterator迭代keys并搜索values 该种方法是我使用最频繁的,没有之一,详见如下代码: Map<Integer, Integer> map = new HashMap<Integer,

转:Java HashMap实现详解

Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 2.    HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造