java是否在for循环中缓存数组引用?

有类似的问题:


高级 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循环中的。


繁星淼淼
浏览 94回答 1
1回答

12345678_0001

不。Java 无法知道someObject.getPrivateArray()每次调用都会返回相同的对象。因此,它必须在每次迭代时调用该函数。例如)Queue<int[]> queue = ...;for(int i=0; i<queue.remove().length; i++) {&nbsp; &nbsp; // ...}这是完全相同的代码模式;只是名称发生了变化,但很明显 的返回值queue.remove()不会被缓存。更新@MattTimmermans 在评论中指出,JVM 可能会内联调用someObject.getPrivateArray(),这样 JVM 可能能够确定每次都返回相同的对象,并优化调用。这需要:someObject是最终的或有效的最终getPrivateArray()是最终的,所以它可以内联getPrivateArray()必须没有副作用(或者无论如何都必须执行副作用)返回的值必须是final其他一些实体不能修改的,保证返回相同的值在这种情况下,JVM可能会优化调用并将提取移出循环,从而有效地缓存结果。当自己缓存值很容易时,我不会依赖它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java