为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 92 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信