【发布时间】:2016-08-10 20:45:19
【问题描述】:
我多次遇到如下代码:
for (char c : s.toCharArray()) {
....
}
我想知道s.toCharArray() 是只执行一次还是执行s.length 次?那么下面的案例呢?
for (int i = 0; i < s.toCharArray().length; i++) {
....
}
受cmets启发,做了一些测试:
案例1:执行时间:692.664
String s = "dfsdfjglsdlghsl";
for(int i = 0 ; i < 25; i++){
s += s;
}
long start_time = System.nanoTime();
for(char c : s.toCharArray()){
int i = 0;
}
long end_time = System.nanoTime();
double excution_time = (end_time - start_time)/1e6;
System.out.println(excution_time);
案例2:执行时间:688.217
String s = "dfsdfjglsdlghsl";
for(int i = 0 ; i < 25; i++){
s += s;
}
long start_time = System.nanoTime();
char[] carrays = s.toCharArray();
for(char c : carrays){
int i = 0;
}
long end_time = System.nanoTime();
double excution_time = (end_time - start_time)/1e6;
System.out.println(excution_time);
几乎一样。所以,s.toCharArray() 在第一种情况下应该只执行一次。
【问题讨论】:
-
只执行一次。您可以找到与增强的 for 循环 in JLS 等效的基本 for 循环(搜索“否则,表达式必须具有数组类型,T[]。”)。
-
在第二个示例中,每次执行循环时都会调用
s.toCharArray().length。这很不幸,因为它每次都将字符串复制到一个新数组中,这使得这个 for 循环在字符串长度上至少是二次的。它在功能上也等价于常数时间表达式s.length();我推荐后者。 -
+1 表示 Any 的评论,我想这可以变成答案。我的评论是:在调试器中执行这个并设置一个断点来观察 Andy 的声明。