有類似的問題:高級 for 循環確實緩存引用,因為它使用相同的迭代器實例:https ://stackoverflow.com/a/29812538/4087512正常的 for 循環確實緩存長度:https://stackoverflow.com/a/1208331/4087512但我正在嘗試查看引用是否緩存在經典的 for 循環中:for(int i=0; i<someObject.getPrivateArray().length; i++){ //do something where it's necessary to use i AND getPrivateArray()}而不是:int j=0;for(int var : someObject.getPrivateArray()){ //do something with j & var j++;}從此處回答的問題來看:for 循環和 for-each 循環之間是否存在性能差異?這 2 個在本地范圍內聲明的數組上具有相同的性能,但是從 for 循環的不同對象獲取數組是否會產生開銷?上面回答說數組其實是緩存在foreach循環中的。
1 回答

12345678_0001
TA貢獻1802條經驗 獲得超5個贊
不。
Java 無法知道someObject.getPrivateArray()
每次調用都會返回相同的對象。因此,它必須在每次迭代時調用該函數。
例如)
Queue<int[]> queue = ...;
for(int i=0; i<queue.remove().length; i++) {
// ...
}
這是完全相同的代碼模式;只是名稱發生了變化,但很明顯 的返回值queue.remove()
不會被緩存。
更新
@MattTimmermans 在評論中指出,JVM 可能會內聯調用someObject.getPrivateArray()
,這樣 JVM 可能能夠確定每次都返回相同的對象,并優化調用。這需要:
someObject
是最終的或有效的最終getPrivateArray()
是最終的,所以它可以內聯getPrivateArray()
必須沒有副作用(或者無論如何都必須執行副作用)返回的值必須是
final
其他一些實體不能修改的,保證返回相同的值
在這種情況下,JVM可能會優化調用并將提取移出循環,從而有效地緩存結果。當自己緩存值很容易時,我不會依賴它。
添加回答
舉報
0/150
提交
取消