第一种遍历方式(采用keySet):
HashMap hashmap = new HashMap();
Iterator iterator = hashmap.keySet().iterator();
while (iterator.hasNext()) {
hashmap.get(iterator.next());
}
}
第二种遍历方式(采用entrySet):
HashMap hashmap = new HashMap();
Iterator iterator = hashmap.entrySet().iterator()
while (iterator .hasNext()) {
Entry entry = (Entry) iterator .next();
entry.getValue();
}
}
JDK官方解释:
keySet:返回此映射中所包含的键的 set 视图。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
entrySet:返回此映射所包含的映射关系的 collection 视图。在返回的集合中,每个元素都是一个 Map.Entry。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过 Iterator.remove、Collection.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。
测试:创建两个HashMap,每个map中放入100万条数据,对其进行遍历,统计遍历所用的时间。
测试结果:(本机测试,机器不同速度也会不同)使用keySet遍历所用时间为200毫秒左右;使用entrySet遍历所用时间为120毫秒左右
测试代码:(可直接拷贝运行)
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
public class HashMapTest {
public static void main(String[] args) {
//第二种遍历方式
HashMap hashmap = new HashMap();
for (int i = 0; i < 1000000; i++) {
hashmap.put(i, "");
}
long bs = Calendar.getInstance().getTimeInMillis();
Iterator iterator = hashmap.keySet().iterator();
while (iterator.hasNext()) {
hashmap.get(iterator.next());
}
System.out.println(Calendar.getInstance().getTimeInMillis() - bs);
hashmap = null;//将对象赋值为null,不然内存溢出(仅针对本人笔记本……)
iterator = null;//将对象赋值为null,不然内存溢出(仅针对本人笔记本……)
//第二种遍历方式
HashMap hashmap2 = new HashMap();
for (int i = 0; i < 1000000; i++) {
hashmap2.put(i, "");
}
long bs2 = Calendar.getInstance().getTimeInMillis();
Iterator it2 = hashmap2.entrySet().iterator();
while (it2.hasNext()) {
Entry entry = (Entry) it2.next();
entry.getValue();
}
System.out.println(Calendar.getInstance().getTimeInMillis() - bs2);
}
}
keySet:由hashMap获取keySet,将keySet遍历,转为iterator,遍历iterator,从map中取出对应key的value
entrySet:由hash获取entrySet,entrySet中包含了key和value,遍历entrySet即可取出value