对HashMap的两种遍历方法

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>的遍历结果相差如此之小,如果键值对的规模比较小,这两种方法的效率差异更小,甚至可以忽略不计。

本文只讨论了这两种方法执行时间方面的差异,并没有对这两种方法在执行时,对内存占用的情况的分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值