为KeySet遍历HashMap辟谣---效率问题

    听某位高级软件开发工程师说遍历HashMap的三种方式,用KeySet遍历的方式会非常慢,效率特别低,所以推荐使用EntrySet的方式遍历HashMap,这两种都是可以获取到HashMap的key-value对,另外一种遍历HashMap的方式是调用HashMap的values方法,但是无法得到key的值。当听到说keyset特别慢,效率低下的时候,我就在想,如果这样真的那么慢的话,那么jdk是不是早就把这样的方式给废弃了啊,或者加上@Deprecated了。所以我想着证明一下。看以下代码
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的方式。

你可能感兴趣的:(java)