有类似的问题:高级 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
提交
取消