日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java集合篇:Map常用遍历方式 以及 性能对比

發布時間:2024/9/30 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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常用遍历方式 以及 性能对比的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。