`

HashMap的遍历源码

阅读更多
遍历可以分为上面两种方法,hm.entrySet().iterator()和 hm.keySet().iterator(). entrySet会比keySet快很多。在查资料的时候看到说 hm.entrySet()的时候会拷贝出hashtable中的数据到一个新的Set中,其实不是。

public class IterHashMap {
	public static void main(String args[]) {
		HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
		for (int i = 0; i < 10000; i++) {
			hm.put(i, i);
		}

		Date start = new Date();
		System.out.println("****************Method 1***************");
		Iterator iter = hm.entrySet().iterator();
		while (iter.hasNext()) {
			Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) iter
					.next();
			System.out.print("Key:" + entry.getKey() + ", Value"
					+ entry.getValue() + "\n");
		}

		Date end = new Date();

		System.out.print((end.getTime() - start.getTime()) + "\n");

		start = new Date();

		System.out.println("****************Method 2***************");
		Iterator iterKey = hm.keySet().iterator();
		while (iterKey.hasNext()) {
			Integer entry = (Integer) iterKey.next();
			System.out.print("Key:" + entry + ", Value" + hm.get(entry) + "\n");
		}
		 end = new Date();
		System.out.print((end.getTime() - start.getTime()) + "\n");
	}
}

HashMap使用了内部类来实现: 下面代码中的table是hashmap中的变量,用来存储数据

private abstract class HashIterator<E> implements Iterator<E> {
  final Entry<K,V> nextEntry() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
            Entry<K,V> e = next;
            if (e == null)
                throw new NoSuchElementException();

            if ((next = e.next) == null) {
                Entry[] t = table;
                while (index < t.length && (next = t[index++]) == null)
                    ;
            }
	    current = e;
            return e;
        }
}

可以看到用keyIterator和EntryIterator的唯一区别是keyIterator会调用getKey()获得key,然后返回。
  private final class KeyIterator extends HashIterator<K> {
        public K next() {
            return nextEntry().getKey();
        }
    }

    private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {
        public Map.Entry<K,V> next() {
            return nextEntry();
        }
    }
分享到:
评论

相关推荐

    如何遍历Map-Java版源码

    博文《Java中如何遍历map》源码。可以直接粘贴博文中源码 也可以下载它,免费了。

    Java8 HashMap源码的简单分析(1)

    首先在阅读HashMap源码前,我们需要知道的: 一.数组:连续的存储结构,存储相同类型的数据。对于指定下标的查找,时间复杂度为o(1);对于定值的查找,需要遍历数组,时 间复杂度为o(n),对于有序数组,则可采用二...

    java7hashmap源码-Rebuild-Java:再度重修JAVA

    hashmap源码 README 虽然JAVASE看完了,但仔细一想,好像有很多似懂非懂的知识点,好像会,但仔细一想,却不会。 因此重修JAVA 着重看集合,IO,多线程 泛型例子--&gt;来自java编程思想--P397 Holder.java ...

    java7hashmap源码-Note-For-Java:Java笔记

    hashmap源码 Note-For-Java 记录一下java学习过程的重要知识点 1.在java中如果被除数或者除数有一个为浮点类型,0或者0.0是可以用作除数的,结果得正负无穷;取余操作亦是如此。 2.java在7.0之后switch语句case后面...

    (002)HashMap$TreeNode之往红黑树添加元素-putTreeVal方法.docx

    HashMap之往红黑树添加元素-putTreeVal方法源码解读:当要put的元素所在数组索引位置已存在元素,且是红黑树类型时,就会调用putTreeVal方法添加元素到红黑树上,具体操作步骤如下: 1. 从根节点开始,到左右子树,...

    Java性能优化手册100技巧 中文PDF最新版

    HashMap 7 种遍历方式的性能评测与优化 If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + ...

    java版斗地主源码-PokerSystem:更新小案例,巩固学习Java面向对象思想

    Map以及HashMap的定义方法、遍历方式、及其类内部方法的使用: ··map.put(0, "大王") 将数据存入HashMap; · Map不可以foreach遍历,Set则可以; · Map的遍历需要借助map.get(key)方法,使用for循环遍历。 ...

    java猜字母游戏源码-leetcode:leetcode记录

    java猜字母游戏源码 #leetcode 001_Medium: Two Sum.利用哈希表(在O(1)时间复杂度内查找某个元素)。遍历数组,查找map里是否containsKey(target-nums[i]),如果则返回,否则将nums[i]放入map中(map.put(nums[i],i)...

    哈希表类_汇编版(HashMap_ASM) 2.7版-易语言

    通过遍历序号取键值,性能较低,单次取值时间复杂度: O(n),非必要不建议使用)  8) 说明 枚举键值还是乱序枚举,因为即便是有序模式xx的储存依然是无序的.可使用 取所有键() 取所有值() 存到数组来遍历. 2.6版(2020.3....

    java词典源码-WordSeperator:Java源代码和字典,可用于将复合词分隔为子词

    java字典源码字词分隔符 Java源代码和字典,可用于将复合词分隔为子词。 编译并使用字典作为参数运行Seperator。 字典必须以行分隔,并且理想情况下不应包含任何复合词。 复杂度估算 空间复杂度 数据结构 字典被存储...

    java编程宝典

    Object&gt;&gt; map = new HashMap(); 13 4线程 14 两种方式的卖票线程 1) 继承 Thread 类,数据无法共享 14 2) 实现 Runnable 接口,数据可以共享(推荐) 15 2.每两秒钟生成一个验证码 17 2. 抽奖小程序 21 5工具类 31 ...

    阿里巴巴Java性能调优实战(2021-2022华山版)+Java架构核心宝典+性能优化手册100技巧.rar

    HashMap 7 种遍历方式的性能评测与优化 If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + ...

    Map

    掌握上述的每个方法的应用(采用String,Integer等JDK已提供的引用数据类型),重点掌握数据的存储及遍历的方式(两种遍历方式都要掌握) 四、深入分析HashMap的存储 深入掌握HashMap的关键技术点,如何区分是否重复...

    java猜字母游戏源码-homework:算法作业

    java猜字母游戏源码 算法作业 自己方便查阅同时熟悉Git的操作 UVaOJ blackyau Virtual Judge 备忘录 最长公共子序列 八皇后问题 dp 出栈次序 给定一个足够大的栈,进栈序列为1,2,3,…,n,求有多少个不同的出栈...

    蚂蚁金服面试分享.pdf

    基础模块考察(面试官问) 1&gt; 模块化的好处 2&gt; http协议 3&gt; HashMap和ConcurrentHashMap的区别,以及两者的优缺点 4&gt; 数据库(事物,加锁,ORM) 5&gt; JVM原理 6&gt; jdk源码,以及线程(关键在线程),Java垃圾回收机制 7&gt; ...

    Java服务器端开发面试.doc

    涉及到各种效率问题等,里面最好阅读一下源码 集合的遍历方法和使用iterator来遍历的区别,集合可否修改,能否删除其中的一 个元素,然后size是否变化等等问题 JAVA垃圾回收,内存结构 异常的种类 Object类,哪些...

    利用Map集合储存并打印数据库信息

    利用Map集合储存并打印数据库信息 java练习题 实验目的: 1、 学习哈希映射的创建;...遍历集合,输出集合中的所有键-值对。 (3)提交源码和运行截图。 package Test; import java.util.HashMap; impo

    疯狂JAVA讲义

    7.2.1 使用Iterator接口遍历集合元素 244 7.2.2 使用foreach循环遍历集合元素 246 7.3 Set接口 247 7.3.1 HashSet类 247 学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 ...

    超级有影响力霸气的Java面试题大全文档

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...

    java 面试题 总结

    通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...

Global site tag (gtag.js) - Google Analytics