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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HashMap两种遍历数据的方式

發(fā)布時間:2023/12/2 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HashMap两种遍历数据的方式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

HashMap的遍歷有兩種方式,一種是entrySet的方式,另外一種是keySet的方式。

第一種利用entrySet的方式:

Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue(); }

上面的方式可以變化為for循環(huán)的形式:

Map<String, String> map = new HashMap<String, String>(); for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue(); }

第二種利用keySet的方式:

Map map = new HashMap(); Iterator iter = map.keySet().iterator(); while (iter.hasNext()) {Object key = iter.next();Object val = map.get(key); }

上面的方式也可以變化為for循環(huán)的形式:

Map<String, String> map = new HashMap<String, String>(); for (String key : map.keySet()) {map.get(key); }

這兩種方式那種效率高呢?可以從下面的試驗可以看出來:

public class Test {public static void main(String[] args){HashMap<String, String> map = new HashMap<String, String>();for (int i = 0; i < 1000000; i++){map.put(i + "", "hello world");}long begin1 = System.currentTimeMillis();Iterator iterator1 = map.entrySet().iterator();while (iterator1.hasNext()){Map.Entry entry = (Map.Entry) iterator1.next();Object key1 = entry.getKey();Object val1 = entry.getValue();}long end1 = System.currentTimeMillis();System.out.println("map.entrySet方式變量花費的時間為:" + (end1 - begin1));long begin2 = System.currentTimeMillis();Iterator iterator2 = map.keySet().iterator();while (iterator2.hasNext()){Object key2 = iterator2.next();Object val2 = map.get(key2);}long end2 = System.currentTimeMillis();System.out.println("map.keySet方式變量花費的時間為:" + (end2 - begin2));} }

結(jié)論:
經(jīng)過運行多次,我發(fā)現(xiàn)兩者的運行時間相差不多,而且沒有明確顯示出那種變量方式更快一些。有的人可能會覺得第一種變量方式會快一些,因為他們覺 得:keySet方式其實是遍歷了2次,一次是轉(zhuǎn)為iterator,一次就從HashMap中取出key所對應(yīng)的value,而entry方式只遍歷了 一次,把key和value都放到了entry中,所以entry方式更快一些。
但是我覺得這種分析的方式比較主觀,我們更應(yīng)該從源碼的角度去分析。首先看一下迭代器的源碼:

keySet的迭代器:

private final class KeyIterator extends HashIterator<K> {public K next() {return nextEntry().getKey();} }

entrySet的迭代器:

private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {public Map.Entry<K,V> next() {return nextEntry();} }

從上面我們可以看到只是返回值不同而已,父類相同,所以性能相差不多。下面我們再看一下get方法的源碼:

public V get(Object key) { if (key == null) return getForNullKey(); Entry<K,V> entry = getEntry(key); return null == entry ? null : entry.getValue(); } final Entry<K,V> getEntry(Object key) { int hash = (key == null) ? 0 : hash(key); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }

從上面的源碼發(fā)現(xiàn)get的時間復(fù)雜度取決于for循環(huán)循環(huán)次數(shù),即hash算法。所以兩種性能差別不大。從上面的分析來看,我們得到最終的結(jié)論:
(1)HashMap的循環(huán),如果既需要key也需要value,直接用下面的即可,foreach簡潔易懂。

Map<String, String> map = new HashMap<String, String>(); for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue(); }

(2)如果只是遍歷key而無需value的話,可以直接用下面的方式:

Map<String, String> map = new HashMap<String, String>(); for (String key : map.keySet()) {// key process }

原文地址:http://swiftlet.net/archives/1259

轉(zhuǎn)載于:https://www.cnblogs.com/longshiyVip/p/4633190.html

總結(jié)

以上是生活随笔為你收集整理的HashMap两种遍历数据的方式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。