Java集合篇:Map常用遍历方式 以及 性能对比
一、Map集合常用的遍歷方式:
遍歷Map集合的常用方式有三種:使用keySet的方式,使用entrySet的方式,使用values()取值的方式,這三種方式中,都有對應的for循環遍歷和Iterator遍歷的方式取值。
具體用法如下:
public class MapTest {public static void main(String[] args) {HashMap<Integer,String> map= new HashMap<Integer,String>();for(int i = 0;i < 1000000;i++){map.put(i, "第"+i+"個元素");}//第一種方式:keySet的for循環遍歷方式long time1 = System.nanoTime();for(Integer key : map.keySet()){map.get(key);}long time2 = System.nanoTime();//第一種方式:keySet的Iterator遍歷方式Iterator<Integer> iterator = map.keySet().iterator();while(iterator.hasNext()){Integer key = iterator.next();map.get(key);}long time3 = System.nanoTime();//第二種方式:entrySet的for循環遍歷方式for(Entry<Integer,String> entry: map.entrySet()){entry.getKey();entry.getValue();}long time4 = System.nanoTime();//第二種方式:entrySet的Iterator遍歷方式Iterator<Entry<Integer, String>> iterator2 = map.entrySet().iterator();Entry<Integer, String> entry;while(iterator2.hasNext()){entry = iterator2.next();entry.getKey();entry.getValue();}long time5 = System.nanoTime();//第三種方式:只能得到value,可以用values()返回包含所有value的Collection<T>,不容易得到對應的key//values()方法的for循環遍歷方式Collection<String> values = map.values();for(String value : values){}long time6 = System.nanoTime();//values()方法的Iterator遍歷方式Iterator<String> iterator3 = map.values().iterator();String value;while(iterator3.hasNext()){value=iterator3.next();}long time7 = System.nanoTime();System.out.println("keySet的for循環遍歷方式耗時:" + (time2-time1)/1000 + "微秒");System.out.println("keySet的Iterator遍歷方式耗時:" + (time3-time2)/1000 + "微秒");System.out.println("entrySet的for循環遍歷方式耗時:" + (time4-time3)/1000 + "微秒");System.out.println("entrySet的Iterator遍歷方式耗時:" + (time5-time4)/1000 + "微秒");System.out.println("values()方法的for循環遍歷方式耗時:" + (time6-time5)/1000 + "微秒");System.out.println("values()方法的Iterator遍歷方式耗時:" + (time7-time6)/1000 + "微秒");} }keySet是鍵的集合,Set里面的類型即key的類型;
entrySet是鍵-值對的集合,Set里面的類型是Map.Entry,Entry是一個鍵-值對;
keySet():迭代后只能通過get()取key;
entrySet():迭代后可以e.getKey(),e.getValue()取key和value,返回的是Entry接口;
?
二、遍歷的性能對比:
前面的代碼的輸出結果如下:
keySet的for循環遍歷方式耗時:41822微秒 keySet的Iterator遍歷方式耗時:36073微秒 entrySet的for循環遍歷方式耗時:31792微秒 entrySet的Iterator遍歷方式耗時:25888微秒 values()方法的for循環遍歷方式耗時:25264微秒 values()方法的Iterator遍歷方式耗時:21215微秒從上面的輸出結果可以看出:
1、在數據元素的數量比較大時,entrySet()方式的遍歷效率快于keySet(),有兩個原因 :
(1)一個原因是keySet相當于遍歷了2次,一次是對key的Set集合的遍歷,二次是每次遍歷過程都要通過key和map.get(key)來獲取value值。
(2)第二個原因是map.get(key)的時候,底層是根據key的hashCode值經過哈希算法得到一個hash值,然后作為索引映射到對應的table數組的索引位置,這是一次密集型計算,很耗費CPU,如果有大量的元素,則會使CPU使用率飆升,影響響應速度,而entrySet()返回的set里面的元素都是Map.Enpty類型,key和value就是這個類的一個屬性,entry.getKey()和entry.getValue()效率肯定很高。
2、不過,在數據元素的數量比較小的情況小,keySet()方式的遍歷效率快于entrySet()。
3、values()是返回Map的所有value的集合的Collection,只能遍歷到value,很難遍歷到key,所以一般不用,如果當我們只需要取得value值時,采用values來遍歷效率更高。
4、從上面的幾種方式的for循環遍歷和Iterator遍歷的方式耗時結果來看,Iterator遍歷的效率會比for循環效率更快一點。
總結
以上是生活随笔為你收集整理的Java集合篇:Map常用遍历方式 以及 性能对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础篇:数组
- 下一篇: Java集合篇:集合类介绍