遍历可以分为上面两种方法,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();
}
}
分享到:
相关推荐
博文《Java中如何遍历map》源码。可以直接粘贴博文中源码 也可以下载它,免费了。
首先在阅读HashMap源码前,我们需要知道的: 一.数组:连续的存储结构,存储相同类型的数据。对于指定下标的查找,时间复杂度为o(1);对于定值的查找,需要遍历数组,时 间复杂度为o(n),对于有序数组,则可采用二...
hashmap源码 README 虽然JAVASE看完了,但仔细一想,好像有很多似懂非懂的知识点,好像会,但仔细一想,却不会。 因此重修JAVA 着重看集合,IO,多线程 泛型例子-->来自java编程思想--P397 Holder.java ...
hashmap源码 Note-For-Java 记录一下java学习过程的重要知识点 1.在java中如果被除数或者除数有一个为浮点类型,0或者0.0是可以用作除数的,结果得正负无穷;取余操作亦是如此。 2.java在7.0之后switch语句case后面...
HashMap之往红黑树添加元素-putTreeVal方法源码解读:当要put的元素所在数组索引位置已存在元素,且是红黑树类型时,就会调用putTreeVal方法添加元素到红黑树上,具体操作步骤如下: 1. 从根节点开始,到左右子树,...
HashMap 7 种遍历方式的性能评测与优化 If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + ...
Map以及HashMap的定义方法、遍历方式、及其类内部方法的使用: ··map.put(0, "大王") 将数据存入HashMap; · Map不可以foreach遍历,Set则可以; · Map的遍历需要借助map.get(key)方法,使用for循环遍历。 ...
java猜字母游戏源码 #leetcode 001_Medium: Two Sum.利用哈希表(在O(1)时间复杂度内查找某个元素)。遍历数组,查找map里是否containsKey(target-nums[i]),如果则返回,否则将nums[i]放入map中(map.put(nums[i],i)...
通过遍历序号取键值,性能较低,单次取值时间复杂度: O(n),非必要不建议使用) 8) 说明 枚举键值还是乱序枚举,因为即便是有序模式xx的储存依然是无序的.可使用 取所有键() 取所有值() 存到数组来遍历. 2.6版(2020.3....
java字典源码字词分隔符 Java源代码和字典,可用于将复合词分隔为子词。 编译并使用字典作为参数运行Seperator。 字典必须以行分隔,并且理想情况下不应包含任何复合词。 复杂度估算 空间复杂度 数据结构 字典被存储...
Object>> map = new HashMap(); 13 4线程 14 两种方式的卖票线程 1) 继承 Thread 类,数据无法共享 14 2) 实现 Runnable 接口,数据可以共享(推荐) 15 2.每两秒钟生成一个验证码 17 2. 抽奖小程序 21 5工具类 31 ...
HashMap 7 种遍历方式的性能评测与优化 If / switch 性能评测 switch 性能优化 JVM 性能优化 MySQL性能优化的 50+ 小技巧 Redis 性能优化的 13 个小技巧 . . . 每篇文章图文并茂,附有源码 + 性能评测结果 + ...
掌握上述的每个方法的应用(采用String,Integer等JDK已提供的引用数据类型),重点掌握数据的存储及遍历的方式(两种遍历方式都要掌握) 四、深入分析HashMap的存储 深入掌握HashMap的关键技术点,如何区分是否重复...
java猜字母游戏源码 算法作业 自己方便查阅同时熟悉Git的操作 UVaOJ blackyau Virtual Judge 备忘录 最长公共子序列 八皇后问题 dp 出栈次序 给定一个足够大的栈,进栈序列为1,2,3,…,n,求有多少个不同的出栈...
基础模块考察(面试官问) 1> 模块化的好处 2> http协议 3> HashMap和ConcurrentHashMap的区别,以及两者的优缺点 4> 数据库(事物,加锁,ORM) 5> JVM原理 6> jdk源码,以及线程(关键在线程),Java垃圾回收机制 7> ...
涉及到各种效率问题等,里面最好阅读一下源码 集合的遍历方法和使用iterator来遍历的区别,集合可否修改,能否删除其中的一 个元素,然后size是否变化等等问题 JAVA垃圾回收,内存结构 异常的种类 Object类,哪些...
利用Map集合储存并打印数据库信息 java练习题 实验目的: 1、 学习哈希映射的创建;...遍历集合,输出集合中的所有键-值对。 (3)提交源码和运行截图。 package Test; import java.util.HashMap; impo
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 ...
通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 11、EJB是基于哪些技术实现的?并说出...
通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。 8、EJB是基于哪些技术实现的?并说出Session...