高性能的Java集合疊代

瞭解有關Java中forEach循環的更多信息,以及本文中有關使用Java處理集合的C style和Stream API的比較。

介紹

Java開發人員通常處理諸如ArrayList和HashSet之類的集合。Java 8附帶了lambda和流Stream API,可以幫助我們輕鬆處理集合。在大多數情況下,我們使用幾千個項目並且性能不是問題。但是,在某些極端情況下,當我們不得不多次遍歷幾百萬個item時,性能將變得很痛苦。

我使用JMH來檢查每個代碼片段的運行時間。

forEach vs. C Style vs. Stream API

迭代是一個基本功能。所有編程語言都有簡單的語法,允許程序員運行集合。Stream API可以非常直接的方式迭代集合。

高性能的Java集合迭代

forEach循環同樣簡單:

高性能的Java集合迭代

C style更冗長,但仍然非常緊湊:

高性能的Java集合迭代

性能表現:

高性能的Java集合迭代

使用C style,JVM只會增加一個整數,然後直接從內存中讀取值。這使它非常快。但是,根據StackOverFlow社區上的這個答案和來自Oracle的文檔,每個都是非常不同的,JVM必須將forEach轉換為迭代器並對每個項目調用hasNext()。這就是為什麼forEach比C style慢。

哪種是高性能的遍歷方式?

我們定義測試數據:

高性能的Java集合迭代

Java Set還支持Stream API和forEach循環。根據之前的測試,如果我們將Set轉換為ArrayList,然後通過ArrayList,可能性能提升?

高性能的Java集合迭代

迭代器與C style for循環的組合怎麼樣?

高性能的Java集合迭代

或者,簡單的遍歷呢?

高性能的Java集合迭代

這是一個不錯的主意,但它不起作用,因為初始化新的ArrayList也會消耗資源。

高性能的Java集合迭代

HashMap(HashSet使用HashMap )不是為迭代所有項而設計的。迭代HashMap的最快方法是Iterator和C style for循環的組合,因為JVM不必調用hasNext()。

結論

使用Foreach和Stream API可以方便地使用集合。你可以更快地編寫代碼。但是,當你的系統穩定並且性能是一個主要問題時,你應該考慮重寫你的循環。


分享到:


相關文章: