遍历可以分为上面两种方法,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();
}
}
分享到:
相关推荐
8. **遍历操作**:HashMap类通常提供迭代器接口,允许用户按顺序或无序地遍历所有的键值对。 9. **容量管理**:`Capacity`属性可能用于获取或设置HashMap当前的容量,而`LoadFactor`可能表示当前元素数量与容量的...
下面我们将深入探讨HashMap的源码,特别是关于`put`和`get`操作的实现细节。 HashMap的核心数据结构是一个数组配合链表/红黑树的数据结构。数组中的每个元素是一个Node对象,Node包含键、值、哈希码以及指向下一个...
《HashMap源码剖析》 HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,提供了键值对(Key-Value)的存储方式。HashMap在内部使用了一个数组和链表来实现,实现了快速的查找、插入和删除...
查找操作则是根据键的哈希值找到数组的索引,然后遍历链表直到找到对应的键值对或遍历结束(链表头为null)。删除操作需要找到对应的键值对,然后从链表中移除。 HashMap 是非线程安全的,这意味着在多线程环境下,...
由于HashMap使用了链表或红黑树,所以在遍历HashMap时,如果哈希分布不均,可能会出现性能下降。在设计和使用HashMap时,应尽量避免哈希冲突,保证良好的哈希分布。 7. **equals()和hashCode()** 插入HashMap的...
HashMap 之 put 方法源码解读 HashMap 是 Java 中一种常用的数据结构,用于存储键值对。其中,put 方法是 HashMap 中最重要的方法之一,负责将键值对存储到HashMap 中。在本文中,我们将对 HashMap 的 put 方法的...
5. **迭代器**:为了遍历HashMap中的所有键值对,源码中通常会包含一个迭代器类,允许程序员按顺序访问HashMap的所有元素。 6. **内存管理**:易语言HashMap类需要考虑内存的分配与释放,特别是在动态扩容时,旧的...
HashMap 中红黑树 TreeNode 的 split 方法源码解读 HashMap 中红黑树 TreeNode 的 split 方法是 Java 中HashMap 的核心组件之一,负责将红黑树从旧数组转移到新数组上,并进行树链表的重新组织和优化。在本文中,...
HashMap的源码解析涉及到的数据结构主要包括数组和链表,以及在负载过大时升级为红黑树的优化策略。理解这些机制对于高效使用HashMap和解决相关问题至关重要。此外,HashMap是非线程安全的,如果在多线程环境下使用...
4. **无序性**:HashMap不保证元素的顺序,插入顺序和遍历顺序可能不同,因为它是基于哈希值进行定位的。 5. **线程不安全**:HashMap不是线程安全的,如果在多线程环境中使用,需要外部同步机制,或者使用...
在JDK 1.7版本中,HashMap的实现机制有着独特的设计,本文将详细剖析其内部的工作原理和源码实现。 1. **HashMap的基本结构** HashMap基于哈希表(散列表)的数据结构,内部使用一个Entry数组作为主要的数据存储...
Java HashMap三种循环遍历方式及其性能对比实例分析 Java HashMap是一种常用的数据结构,在Java编程中经常被使用。HashMap提供了三种循环遍历方式,即for each map.entrySet()、显示调用map.entrySet()的集合迭代器...
本篇文章将深入对比Java 7和Java 8中HashMap的源码实现,探讨它们在解决哈希冲突和优化性能上的差异。 一、HashMap的基本原理 HashMap基于哈希表实现,它使用键的哈希值来决定键值对在数组中的位置。哈希表通过计算...
3. **并发修改异常**:当一个线程正在遍历`HashMap`时,另一个线程对其进行了修改,则可能会抛出`ConcurrentModificationException`异常。 #### 三、解决方案概述 针对以上提到的问题,有多种不同的解决方案可以...
Java集合系列之HashMap源码分析 Java集合系列之HashMap源码分析是Java集合系列中的一篇非常重要的文章,它详细介绍了Java集合系列之HashMap源码,具有很高的参考价值。下面我们将对HashMap源码进行详细的分析。 ...
7. **枚举所有键**:通过枚举器,开发者可以按顺序遍历HashMap中的所有键,这对于遍历整个哈希表进行操作非常有用。 8. **键总数**:`键总数`方法返回HashMap中键的数量,反映当前存储的键值对个数。 9. **是否为...
在遍历过程中,如果有其他线程修改HashMap(添加、删除或修改元素),可能会出现迭代器抛出`ConcurrentModificationException`。 总结起来,深入理解Java 7 HashMap的源码,可以帮助我们更好地利用这个工具,同时也...