听某位高级软件开发工程师说遍历HashMap的
三种方式,用KeySet遍历的方式会非常慢,效率特别低,所以推荐使用EntrySet的方式遍历HashMap,这两种都是可以获取到HashMap的key-value对,另外一种遍历HashMap的方式是调用HashMap的values方法,但是无法得到key的值。当听到说keyset特别慢,效率低下的时候,我就在想,如果这样真的那么慢的话,那么jdk是不是早就把这样的方式给废弃了啊,或者加上@Deprecated了。所以我想着证明一下。看以下代码
class="java" name="code">import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class JudgeHashMap {
public static void main(String[] args) {
Map<Integer, Integer> hashMap = new HashMap<Integer, Integer>();
for (int i = 0; i < 1000000; i++) {
hashMap.put(i, i);
}
long start = System.nanoTime();
Set<Integer> set = hashMap.keySet();
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()) {
iterator.next();
}
long mid = System.nanoTime();
System.out.println("keySet用的时间是" + (mid - start) / 1e10 + "秒");
long mid2 = System.nanoTime();
Set<Entry<Integer, Integer>> sEntries = hashMap.entrySet();
Iterator<Entry<Integer, Integer>> iterator2 = sEntries.iterator();
while (iterator2.hasNext()) {
iterator2.next();
}
long end = System.nanoTime();
System.out.println("entrySet用的时间是" + (end - mid2) / 1e10 + "秒");
long end2 = System.nanoTime();
Collection<Integer> collection = hashMap.values();
Iterator<Integer> iterator3 = collection.iterator();
while (iterator3.hasNext()) {
iterator3.next();
}
long end3 = System.nanoTime();
System.out.println("values用的时间是" + (end3 - end2) / 1e10 + "秒");
}
}
得到的结果是
keySet用的时间是0.0022835033秒
entrySet用的时间是0.0024659158秒
values用的时间是0.0022196947秒
keyset遍历容量为100万的hashmap用时就比entryset多用了0.0004秒。当hashmap的容量比较小的情况下,两者的差距其实可以忽略不计了。
那到底是因为什么引发了这个时间上的差距呢,原因是keyset是通过entryset得到的,然后通过迭代keyset得到键值对,达到遍历的效果,所以会慢一点,但是绝对不是效率低下。所以当HashMap容量比较小的情况下,完全可以使用keyset的方式。