Java 在for循环条件中使用string.length()比初始化为该条件的局部变量要好,为什么?

Java 在for循环条件中使用string.length()比初始化为该条件的局部变量要好,为什么?,java,arrays,string,for-loop,Java,Arrays,String,For Loop,我的印象是,在for循环条件下,使用变量代替对字符串函数length()的方法调用总是更好。虽然这似乎与下面的答案中的分析正好相反 for(int i=0;i

我的印象是,在for循环条件下,使用变量代替对字符串函数
length()
的方法调用总是更好。虽然这似乎与下面的答案中的分析正好相反

for(int i=0;i
快于

final int len = data.length();
for (int i = 0; i < len; i++) {
    ...
}
final int len=data.length();
对于(int i=0;i
原因是什么

定义变量需要在方法字节码中进行堆栈操作

不,没有。调用该方法时,需要在堆栈帧中分配额外的插槽。堆栈帧仍被分配。在分配额外的插槽时没有开销。唯一改变的是字节码中的一个常量,说明堆栈帧需要有多大

具体来说,没有用于声明局部变量的字节码指令

但是,通过识别您的算法,优化可以快速跟踪实际机器代码中的重复操作,而无需变量分配的开销

没有这样的开销


这都是BS。

因为在后一个版本中,首先在变量中获取数据长度,然后在for循环中使用此变量。@kritikaTalwar在这种情况下,我希望第二个版本更快,这与问题的要求相反。@Federico请记住答案是在2013年编写的,回答者指出,截至2016年,许多结果已经失效(虽然没有测试相同的东西,但这表明JVM的优化增加)。@Prabhav这不是对象创建。它只是常量池中的一个int变量。手术并不昂贵,问题不在于他说的对不对。他在一次基准测试中证明了第一种方法比另一种方法给出的结果更好。为什么?这是个问题。唯一合乎逻辑的原因是,我认为测试在很久以前就已经执行了,而JVM现在好多了。但即便如此,背后的原因是什么?别说了。你的全部问题都是关于这个报价的。我反驳了它。如果你不想要,为什么要引用它?如果您不同意我的回答,您必须生成(a)字节码指令和(b)在声明局部变量时执行的相应机器码指令,而您不能,因为没有任何此类指令。原因很明显是
String.length()
,这是一个非常频繁执行的操作,在热点JVM中有一个润滑路径。这就是HotSpot的目的。不,我的问题不是他的报价。我的问题是为什么这么快。如果我同意他的回答,我为什么要问这个问题。我只是引用了他的答案,这样人们就可以知道他对这件事的看法,可能是对的,也可能是错的,我想我会把它去掉,因为它让人困惑。“String.length()是一个非常频繁执行的操作,在HotSpot JVM中有一个润滑路径。这就是HotSpot的用途”可能是一个正在寻找的答案,谢谢。
final int len = data.length();
for (int i = 0; i < len; i++) {
    ...
}