避免在循环内使用String charAt()方法

时间:2015-04-02 09:57:40

标签: java string for-loop

如果我更换,是否会对代码优化(速度等)产生影响?

//之前

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    
     }
}

2 个答案:

答案 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()以字节码形式访问同一个数组,但还有其他指令来检查StringIndexOutOfBoundsExceptionif内的2个条件检查)。

正如 Pshemo 所说 - toCharArray必须遍历整个String并创建数组,该数组将首先复制所有字符。然后,您将不得不再次遍历该副本。 charAt没有这个问题

因此,总的来说,答案可能因架构而异。