final此处的关键字是红色鲱鱼。之所以会出现性能差异,是因为他们说的是两种不同的说法。
public void forEach(IntIntProcedure p) { final boolean[] used = this.used; for (int i = 0; i < used.length; i++) { ... }}的意思是,“获取一个布尔数组,并 对该 数组的每个元素执行某项操作。”
如果没有
final boolean[]used,该函数将说“当索引小于
used当前对象的字段的当前值的长度时,获取当前对象的
used字段的当前值并对索引处的元素执行某些操作
i”。
JIT可能更容易地证明循环绑定不变量以消除多余的绑定检查,等等,因为它可以更轻松地确定导致值
used改变的原因。即使忽略多个线程,如果JIT可以
p.apply更改其值,
used那么JIT也无法消除边界检查或进行其他有用的优化。



