HashMap有两种遍历的方式:
①通过entrySet遍历
②通过keySet遍历
下面,将通过构造一个HashMap,分别用着两种方式对该HashMap进行遍历,并比较这两种方法的性能差异。
首先在构造函数中初始化一个1000000个<key,value>的HashMap,然后分别利用entrySet和keySet对其进行遍历,通过计时,分别得出两种方法执行所用的时间,从而比较它们的效率。
/**
* HashMap遍历的两种方法
*/
package com.hh.hash;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HashMapTest {
/**
* @param args
*/
// 定义个HashMap
private HashMap<Integer, String> hashMap = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMapTest hashMapTest = new HashMapTest();
hashMapTest.compareMethods();
}
// 构造函数,初始化hashMap
public HashMapTest() {
hashMap = new HashMap<Integer, String>();
// 在hashMap中放入1000000个<key,value>键值对
for (int i = 0; i < 1000000; i++) {
hashMap.put(i, "hello " + i);
}
}
/**
* 1.第一种遍历方法: 通过entrySet
*/
public void entrySetMethod() {
Iterator<Map.Entry<Integer, String>> iterator = hashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
int key = entry.getKey();
String value = entry.getValue();
}
}
/**
* 2.第二种遍历方法: 通过keySet
*/
public void keySetMethod() {
Iterator<Integer> iterator = hashMap.keySet().iterator();
while (iterator.hasNext()) {
int key = iterator.next();
String value = hashMap.get(key);
}
}
// 分别用这两种方法遍历hashMap,并计时,比较两种方法的效率
public void compareMethods() {
// 定义初始时间和结束时间
long start = 0, end = 0;
// 对第一种方法计时
start = Calendar.getInstance().getTimeInMillis();
this.entrySetMethod();
end = Calendar.getInstance().getTimeInMillis();
System.out.println("1. entrySet方式遍历,用时 " + (end - start) + "ms");
// 对第二种方式计时
start = Calendar.getInstance().getTimeInMillis();
this.keySetMethod();
end = Calendar.getInstance().getTimeInMillis();
System.out.println("2. keySet方式遍历,用时 " + (end - start) + "ms");
}
}
程序执行的结果如下:
1. entrySet方式遍历,用时 46ms
2. keySet方式遍历,用时 66ms
通过执行结果可以知道,通过entrySet方式遍历的效率要高于keySet方式。
这个结论是有前提的。上面的遍历中,我们对hashMap的key和value都进行了遍历。entrySet方式相当于只访问一次HashMap,而keySet方式相当于访问了两次HashMap,原因是keySet遍历方式在取出value值时,调用了HashMap.get(key)方法。
如果我们只对hashMap中的key进行遍历,这两种方法的遍历效率是非常接近的,下面的结果是对含有10000000个键值对的HashMap中的key遍历的结果:
1. entrySet方式遍历,用时 31ms
2. keySet方式遍历,用时 32ms
10000000个<key,value>的遍历结果相差如此之小,如果键值对的规模比较小,这两种方法的效率差异更小,甚至可以忽略不计。
本文只讨论了这两种方法执行时间方面的差异,并没有对这两种方法在执行时,对内存占用的情况的分析。