HashMap兩種遍歷方式的深入研究


轉自:http://swiftlet.net/archives/1259

HashMap的遍歷有兩種方式,如下所示:
第一種利用entrySet的方式:

上面的方式可以變化為for循環的形式:

第二種利用keySet的方式:

上面的方式也可以變化為for循環的形式:

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

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

entrySet的迭代器:

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

 

 

從上面的源碼發現get的時間復雜度取決於for循環循環次數,即hash算法。所以兩種性能差別不大。從上面的分析來看,我們得到最終的結論:
(1)HashMap的循環,如果既需要key也需要value,直接用

即可,foreach簡潔易懂。
(2)如果只是遍歷key而無需value的話,可以直接用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM