package com.winter.Util.june.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class ForMap {
public static void main(String args[]) {
Map<String,String> map = new HashMap<String,String>();
// map.put("1","haha");
// map.put("2","hehe");
for (int i = 1; i < 10000000; i++) {//创建一个map
map.put(String.valueOf(i), String.valueOf(i));
}
/*************************************************************/
//增强for循环keySet方式访问
final long forKetSetstart=System.nanoTime();
for(String key:map.keySet()) {
String a=key;
String b=map.get(key);
// System.out.println("key:"+key+"-value:"+map.get(key));
}
final long forKetSetend =System.nanoTime();
/*************************************************************/
//增强for循环entrySet方式访问
final long forEntrySetstart=System.nanoTime();
for (Map.Entry<String, String> entry : map.entrySet()){
String a=entry.getKey();
String b=entry.getValue();
// System.out.println("key= " + entry.getKey() + " and value= "+ entry.getValue());
}
final long forEntrySetend =System.nanoTime();
/*************************************************************/
//使用迭代器entrySet遍历Map
final long iteEntrySetstart=System.nanoTime();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
String a=(String) entry.getKey();
String b=(String) entry.getValue();
// System.out.println("map的Key和value为:"+entry.getKey()+"-"+ entry.getValue());
}
final long iteEntrySetend=System.nanoTime();
/*************************************************************/
//使用迭代器KeySet遍历Map
final long iteKeySetstart=System.nanoTime();
Iterator iter1 = map.keySet().iterator();
while (iter1.hasNext()) {
// System.out.println("map的Key和value为:"+iter1.next()+"-"+map.get(iter1.next()));
String a=(String)iter1.next();
String b=(String)map.get(a);
}
final long iteKeySetend=System.nanoTime();
/****************************************************************/
//jdk8才有的lambda表达式,推荐使用
final long lambdastart=System.nanoTime();
map.forEach((key, value) -> {
String a=key;
String b=value;
// System.out.println(key + ":" + value);
});
final long lambdaend=System.nanoTime();
/****************************************************************/
//计算时间
System.out.println("增强for循环KeySet访问Time taken:"+(forKetSetend-forKetSetstart)/1.0e9);
System.out.println("增强for循环EntrySet访问Time taken:"+(forEntrySetend-forEntrySetstart)/1.0e9);
System.out.println("迭代器循环EntrySet访问Time taken:"+(iteEntrySetend-iteEntrySetstart)/1.0e9);
System.out.println("迭代器循环KeySet访问Time taken:"+(iteKeySetend-iteKeySetstart)/1.0e9);
System.out.println("lambda访问Time taken:"+(lambdaend-lambdastart)/1.0e9);
}
}
千万组数据的测试结果如下:
测试结果总结:总的来说迭代器和增强for循环的差别不大,entrySet循环访问的速度快与keySet,原因
keySet 其实是遍历了 2 次, 一次是转为 Iterator 对象, 另一次是从 hashMap 中取出 key,所对应的 value。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率更高。
推荐的是lambda访问。只有在迭代器中才可以做删除操作,其他三种都不能做删除操作。
这是结尾。。。