我创建了以下两种方法:
public void test(String str) {
int len = str.length();
int a = 0;
for (int i = 0; i < 10; i++) {
a = a + len;
}
}
public void test2(String str) {
int a = 0;
for (int i = 0; i < 10; i++) {
a = a + str.length();
}
}
然后我使用 javap -v
为第一个方法 test
生成了代码。
public void test(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: ACC_PUBLIC
Code:
stack=2, locals=5, args_size=2
0: aload_1
1: invokevirtual
4: istore_2
5: iconst_0
6: istore_3
7: iconst_0
8: istore 4
10: goto 20
13: iload_3
14: iload_2
15: iadd
16: istore_3
17: iinc 4, 1
20: iload 4
22: bipush 10
24: if_icmplt 13
27: return
对于test2
,
并且
public void test2(java.lang.String);
descriptor: (Ljava/lang/String;)V
flags: ACC_PUBLIC
Code:
stack=2, locals=4, args_size=2
0: iconst_0
1: istore_2
2: iconst_0
3: istore_3
4: goto 17
7: iload_2
8: aload_1
9: invokevirtual
12: iadd
13: istore_2
14: iinc 3, 1
17: iload_3
18: bipush 10
20: if_icmplt 7
23: return
因此,答案似乎是存储长度有一定的优势(它会产生更短的字节码,相当于23行与27行),这表明它可能会表现得更好,但我怀疑它实际上是否可以被测量。特别是在代码已经JIT编译之后。
最后,您可能需要考虑
public void test(String str)
{
int a = 0;
for( int i = 0, len = str.length(); i < 10; i++) {
a = a + len;
}
}
或者只是
int a = 10 * str.length();
public int length() {return count;}
- jmj