如果我更换,是否会对代码优化(速度等)产生影响?
//之前
public void test(String str)
{
for(int i=0; i<str.length(); i++)
{
System.out.println(str.charAt(i)); // VIOLATION
}
}
上面的代码片段,代码如下: -
//
之后public void test(String str)
{
char[] ch = str.toCharArray(); // CORRECTION
for(int i=0; i < ch.length; i++)
{
System.out.println(ch[i]); // CORRECTION
}
}
答案 0 :(得分:0)
是的。你仍然可以优化。
public void test(String str)
{
char[] ch = str.toCharArray(); // CORRECTION
int n = ch.length;
for(int i=0; i < n; i++)
{
System.out.println(ch[i]); // CORRECTION
}
}
答案 1 :(得分:0)
我认为您不会发现明显的差异。即使你这样做,我相信它因平台而异。
for(int i=0; i<str.length(); i++)
编译器会将其更改为:
int strLength = str.length();
for(int i=0; i<strLength ; i++)
因此,您不会每次在循环内计算长度。
我认为第二种情况只是稍微更快(我可能是错的)因为数组访问速度更快,编译器可以轻松优化。 charAt()
以字节码形式访问同一个数组,但还有其他指令来检查StringIndexOutOfBoundsException
(if
内的2个条件检查)。
正如 Pshemo 所说 - toCharArray必须遍历整个String并创建数组,该数组将首先复制所有字符。然后,您将不得不再次遍历该副本。 charAt没有这个问题。
因此,总的来说,答案可能因架构而异。