瞭解有關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可以非常直接的方式迭代集合。
forEach循環同樣簡單:
C style更冗長,但仍然非常緊湊:
性能表現:
使用C style,JVM只會增加一個整數,然後直接從內存中讀取值。這使它非常快。但是,根據StackOverFlow社區上的這個答案和來自Oracle的文檔,每個都是非常不同的,JVM必須將forEach轉換為迭代器並對每個項目調用hasNext()。這就是為什麼forEach比C style慢。
哪種是高性能的遍歷方式?
我們定義測試數據:
Java Set還支持Stream API和forEach循環。根據之前的測試,如果我們將Set轉換為ArrayList,然後通過ArrayList,可能性能提升?
迭代器與C style for循環的組合怎麼樣?
或者,簡單的遍歷呢?
這是一個不錯的主意,但它不起作用,因為初始化新的ArrayList也會消耗資源。
HashMap(HashSet使用HashMap
結論
使用Foreach和Stream API可以方便地使用集合。你可以更快地編寫代碼。但是,當你的系統穩定並且性能是一個主要問題時,你應該考慮重寫你的循環。
閱讀更多 雲智時代 的文章