`

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();
        }
    }
分享到:
评论

相关推荐

    易语言源码易语言HashMap类源码.rar

    8. **遍历操作**:HashMap类通常提供迭代器接口,允许用户按顺序或无序地遍历所有的键值对。 9. **容量管理**:`Capacity`属性可能用于获取或设置HashMap当前的容量,而`LoadFactor`可能表示当前元素数量与容量的...

    hashMap1.8源码

    下面我们将深入探讨HashMap的源码,特别是关于`put`和`get`操作的实现细节。 HashMap的核心数据结构是一个数组配合链表/红黑树的数据结构。数组中的每个元素是一个Node对象,Node包含键、值、哈希码以及指向下一个...

    HashMap源码剖析共10页.pdf.zip

    《HashMap源码剖析》 HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,提供了键值对(Key-Value)的存储方式。HashMap在内部使用了一个数组和链表来实现,实现了快速的查找、插入和删除...

    HashMap源码分析

    查找操作则是根据键的哈希值找到数组的索引,然后遍历链表直到找到对应的键值对或遍历结束(链表头为null)。删除操作需要找到对应的键值对,然后从链表中移除。 HashMap 是非线程安全的,这意味着在多线程环境下,...

    面试必考之HashMap源码分析与实现

    由于HashMap使用了链表或红黑树,所以在遍历HashMap时,如果哈希分布不均,可能会出现性能下降。在设计和使用HashMap时,应尽量避免哈希冲突,保证良好的哈希分布。 7. **equals()和hashCode()** 插入HashMap的...

    HashMap之put方法源码解读.docx

    HashMap 之 put 方法源码解读 HashMap 是 Java 中一种常用的数据结构,用于存储键值对。其中,put 方法是 HashMap 中最重要的方法之一,负责将键值对存储到HashMap 中。在本文中,我们将对 HashMap 的 put 方法的...

    易语言HashMap类源码-易语言

    5. **迭代器**:为了遍历HashMap中的所有键值对,源码中通常会包含一个迭代器类,允许程序员按顺序访问HashMap的所有元素。 6. **内存管理**:易语言HashMap类需要考虑内存的分配与释放,特别是在动态扩容时,旧的...

    (003)HashMap中红黑树TreeNode的split方法源码解读.docx

    HashMap 中红黑树 TreeNode 的 split 方法源码解读 HashMap 中红黑树 TreeNode 的 split 方法是 Java 中HashMap 的核心组件之一,负责将红黑树从旧数组转移到新数组上,并进行树链表的重新组织和优化。在本文中,...

    详解HashMap源码解析(下).doc

    HashMap的源码解析涉及到的数据结构主要包括数组和链表,以及在负载过大时升级为红黑树的优化策略。理解这些机制对于高效使用HashMap和解决相关问题至关重要。此外,HashMap是非线程安全的,如果在多线程环境下使用...

    HashMap类.rar

    4. **无序性**:HashMap不保证元素的顺序,插入顺序和遍历顺序可能不同,因为它是基于哈希值进行定位的。 5. **线程不安全**:HashMap不是线程安全的,如果在多线程环境中使用,需要外部同步机制,或者使用...

    javahashmap源码-java_HashMap_jdk1.7:我的hashmap

    在JDK 1.7版本中,HashMap的实现机制有着独特的设计,本文将详细剖析其内部的工作原理和源码实现。 1. **HashMap的基本结构** HashMap基于哈希表(散列表)的数据结构,内部使用一个Entry数组作为主要的数据存储...

    Java HashMap三种循环遍历方式及其性能对比实例分析

    Java HashMap三种循环遍历方式及其性能对比实例分析 Java HashMap是一种常用的数据结构,在Java编程中经常被使用。HashMap提供了三种循环遍历方式,即for each map.entrySet()、显示调用map.entrySet()的集合迭代器...

    在Java8与Java7中HashMap源码实现的对比

    本篇文章将深入对比Java 7和Java 8中HashMap的源码实现,探讨它们在解决哈希冲突和优化性能上的差异。 一、HashMap的基本原理 HashMap基于哈希表实现,它使用键的哈希值来决定键值对在数组中的位置。哈希表通过计算...

    HashMap源码分析系列-第四弹:HashMap多线程解决方案.docx

    3. **并发修改异常**:当一个线程正在遍历`HashMap`时,另一个线程对其进行了修改,则可能会抛出`ConcurrentModificationException`异常。 #### 三、解决方案概述 针对以上提到的问题,有多种不同的解决方案可以...

    Java集合系列之HashMap源码分析

    Java集合系列之HashMap源码分析 Java集合系列之HashMap源码分析是Java集合系列中的一篇非常重要的文章,它详细介绍了Java集合系列之HashMap源码,具有很高的参考价值。下面我们将对HashMap源码进行详细的分析。 ...

    易语言HashMap类

    7. **枚举所有键**:通过枚举器,开发者可以按顺序遍历HashMap中的所有键,这对于遍历整个哈希表进行操作非常有用。 8. **键总数**:`键总数`方法返回HashMap中键的数量,反映当前存储的键值对个数。 9. **是否为...

    java7hashmap源码-knowledge-juc:知识-juc

    在遍历过程中,如果有其他线程修改HashMap(添加、删除或修改元素),可能会出现迭代器抛出`ConcurrentModificationException`。 总结起来,深入理解Java 7 HashMap的源码,可以帮助我们更好地利用这个工具,同时也...

Global site tag (gtag.js) - Google Analytics