假设我们有以下声明
arrayList.size();
这句话本身没有任何作用。任何Java编译器或JVM是否会忽略此语句以进行优化?
实际上,编译器或JVM假定语句没有副作用,因此将其删除以进行优化。
答案 0 :(得分:4)
如评论中所述,它并非完全是一种无操作:至少,它必须执行空检查。此外,ArrayList
的子类可能有不同的工作方式。从理论上讲,他们甚至可以从数据库或类似的数据中获取数据。通常,没有人会为ArrayList
做一个子类化,但这样的List
实现是有道理的。
编译器(JIT,而不是javac)必须能够证明它实际上是一种副作用。通常,它非常简单
ArrayList.size()
实现。 1 arrayList
是循环不变量,它就会被移出循环。任何Java编译器或JVM是否会忽略此语句以进行优化?
所以我得出的结论是很有可能发生。
1 这可能会在以后加载,然后会发生 deoptimization 。
2 假设它决定值得优化。
3 如果方法已超过内联限制,例如,由于编码风格错误或由于其他内联,这可能会失败。