gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:40:44 25 4
gpt4 key购买 nike

还有类似的问题:

高级 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++;
}

来自此处回答的问题:Is there a performance difference between a for loop and a for-each loop?这 2 个在本地范围内声明的数组上具有相同的性能,但是从 for 循环的不同对象获取数组是否会产生开销?上面回答说数组其实是缓存在foreach循环中的。

最佳答案

没有。

Java 无法知道 someObject.getPrivateArray() 会在每次调用时返回相同的对象。因此,它必须在每次迭代时调用该函数。

例如)

Queue<int[]> queue = ...;

for(int i=0; i<queue.remove().length; i++) {
// ...
}

这是完全相同的代码模式;只是名称发生了变化,但很明显 queue.remove() 的返回值不会被缓存。


更新

@MattTimmermans 在评论中指出,JVM 可能会内联 someObject.getPrivateArray() 调用,这样 JVM 可能能够确定每次返回的是同一个对象,并优化电话。这需要:

  • someObject 是 final 或 effectively final
  • getPrivateArray() 是最终的,所以它可以内联
  • getPrivateArray() 必须没有副作用(或者无论如何都必须执行副作用)
  • 返回的值必须是final,这样其他实体就不能修改它,保证返回相同的值

在这种情况下,JVM可能优化调用并将提取移出循环,从而有效地缓存结果。我不会依赖它,因为自己缓存值很容易做到。

关于java - java是否在for循环中缓存数组引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57085828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com