HashMap存储的是键值对,所以一般情况下其遍历同List及Set应该有所不同.

但java巧妙的将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了HashMap的遍历处理,使其遍历同List、Set并无差异.

第一种:

Java代码 
  1. Map map = new HashMap();
  2. Iterator iter = map.entrySet().iterator();
  3. while (iter.hasNext()) {
  4. java.util.Map.Entry entry = (Map.Entry) iter.next();
  5. Object key = entry.getKey();
  6. Object val = entry.getValue();
  7. }

第二种:

Java代码 
  1. Map map = new HashMap();
  2. Iterator iter = map.keySet().iterator();
  3. while (iter.hasNext()) {
  4. Object key = iter.next();
  5. Object val = map.get(key);
  6. }
 
 
例如: 
  HashMap的遍历有两种常用的方法,那就是使用keyset及entryset来进行遍历,但两者的遍历速度是有差别的,下面请看实例: 
Java代码 
  1. public class HashMapTest {
  2.   public static void main(String[] args) ...{
  3.   HashMap hashmap = new HashMap();
  4.   for (int i = 0; i < 1000; i ) ...{
  5.       hashmap.put("" i, "that's all");
  6.   }
  7.   long num = Calendar.getInstance().getTimeInMillis();
  8.   Iterator iterator = hashmap.keySet().iterator();
  9.   while (iterator.hasNext()) ...{
  10.       System.out.print(hashmap.get(iterator.next()));
  11.   }
  12.   System.out.println();
  13.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  14.   listHashMap();
  15.   }
  16.   public static void listHashMap() ...{
  17.         java.util.HashMap hashmap = new java.util.HashMap();
  18.   
  19. for (int i = 0; i < 1000; i ) ...{
  20.      hashmap.put("" i, "that's all");
  21.   }
  22.   long num = Calendar.getInstance().getTimeInMillis();
  23.   java.util.Iterator it = hashmap.entrySet().iterator();
  24.   while (it.hasNext()) ...{
  25.   java.util.Map.Entry entry = (java.util.Map.Entry) it.next();
  26.   // entry.getKey() 返回与此项对应的键
  27.   // entry.getValue() 返回与此项对应的值
  28.   System.out.print(entry.getValue());
  29.   }
  30.   System.out.println();
  31.   System.out.println(Calendar.getInstance().getTimeInMillis() - num);
  32.   }
  33.   }
 
 

看JDK源码,对比两种访问方式:

首先看KeySet访问方式:

Java代码 
  1. public Set<K> keySet() {
  2. if (keySet == null) {
  3. keySet = new AbstractSet<K>() {
  4. public Iterator<K> iterator() {
  5. return new Iterator<K>() {
  6. private Iterator<Entry<K,V>> i = entrySet().iterator();
  7. public boolean hasNext() {
  8. return i.hasNext();
  9. }
  10. public K next() {
  11. return i.next().getKey();
  12. }
  13. public void remove() {
  14. i.remove();
  15. }
  16. };
  17. }
  18. public int size() {
  19. return AbstractMap.this.size();
  20. }
  21. public boolean contains(Object k) {
  22. return AbstractMap.this.containsKey(k);
  23. }
  24. };
  25. }
  26. return keySet;
  27. }
 
结论:
通过上边的测试我们可以看出,采用entrySet方式遍历效率要优于keySet,因此在开发中要使用entrySet,尽量避免少使用keySet。

谨慎使用keySet:对于HashMap的2种遍历方式比较的更多相关文章

  1. HashMap的两种遍历方式

    HashMap的两种遍历方式 HashMap存储的是键值对:key-value . java将HashMap的键值对作为一个整体对象(java.util.Map.Entry)进行处理,这优化了Hash ...

  2. HashMap 中7种遍历方式的性能分析

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  3. HashMap 的 7 种遍历方式与性能分析

    前言 随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从 ...

  4. Java中的HashMap的2种遍历方式比较

    首先我们准备数据,准备一个map Map<String, String> map = new HashMap<String, String>(); for (int i = 0 ...

  5. HashMap的四种遍历方式

    package com.xt.map; import java.util.HashMap; import java.util.Iterator; import java.util.Map; impor ...

  6. HashMap的几种遍历方式(转载)

    今天讲解的主要是使用多种方式来实现遍历HashMap取出Key和value,首先在java中如果想让一个集合能够用for增强来实现迭代,那么此接口或类必须实现Iterable接口,那么Iterable ...

  7. HashMap概述及其三种遍历方式

    一.HashMap概述: 1.HashMap是一个散列表,它存储的是键值对(key-value)映射: 2.HashMap继承AbstractMap,实现了Map,Cloneable,Serializ ...

  8. HashMap的四种遍历方法,及效率比较(简单明了)

    https://yq.aliyun.com/ziliao/210955 public static void main(String[] args) { HashMap<Integer, Str ...

  9. HashMap的四种遍历!

    HashMap的四种遍历 import java.util.Collection; import java.util.HashMap; import java.util.Map; import jav ...

随机推荐

  1. vuepress-theme-reco + Github Actions 构建静态博客,部署到第三方服务器

    最新博客链接 Github链接 查看此文档前应先了解,vuepress基本操作 参考官方文档进行配置: vuepress-theme-reco VuePress SamKirkland / FTP-D ...

  2. Tomcat 启动过滤器异常

    严重 [RMI TCP Connection(2)-127.0.0.1] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常 ja ...

  3. Leetcode_1048. 最长字符串链

    字符串的最长严格递增子序列,前后只能相差一个字符. 直接O(N^2)暴力建图,然后记忆化跑个最长路. 直接按字符串长度排序,然后求LIS. code1 class Solution { public: ...

  4. Eclipse新建项目介绍

    最近在用Eclipse,对于一个新手来说,新建项目时出现五花八门的名字,该选择哪个进行创建呢?今天小编抱着学习的态度,顺便整理分享给大家. 选择File->New->Project...  ...

  5. Python之操作文件和目录

    Python内置的os模块可以直接调用操作系统提供的接口函数. # coding=utf-8 # 在指定目录以及指定目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径 import o ...

  6. 第十六周Java实验作业

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: 多线程是进程执行过程中产生的多条执行线索,线程是比进程执行更小的单位. 线程不能独立存在,必须存在于进程 ...

  7. Java并发编程(03):多线程并发访问,同步控制

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发问题 多线程学习的时候,要面对的第一个复杂问题就是,并发模式下变量的访问,如果不理清楚内在流程和原因,经常会出现这样一个问题:线程处理 ...

  8. Tensorflow 介绍和安装

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 作者:AI小昕 本系列教程将手把手带您从零开始学习Tensorfl ...

  9. POJ 3070 Fibonacci矩阵快速幂 --斐波那契

    题意: 求出斐波那契数列的第n项的后四位数字 思路:f[n]=f[n-1]+f[n-2]递推可得二阶行列式,求第n项则是这个矩阵的n次幂,所以有矩阵快速幂模板,二阶行列式相乘, sum[ i ] [ ...

  10. Java并发编程锁之独占公平锁与非公平锁比较

    Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...