亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java是否在for循環中緩存數組引用?

java是否在for循環中緩存數組引用?

繁星淼淼 2023-03-31 16:54:31
有類似的問題:高級 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可能會優化調用并將提取移出循環,從而有效地緩存結果。當自己緩存值很容易時,我不會依賴它。


查看完整回答
反對 回復 2023-03-31
  • 1 回答
  • 0 關注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號