Java 将String.toCharArray()放入for循环是一种好做法吗
我多次遇到如下代码:Java 将String.toCharArray()放入for循环是一种好做法吗,java,string,char,Java,String,Char,我多次遇到如下代码: for (char c : s.toCharArray()) { .... } 我想知道s.tocharray()是只执行一次还是执行s.length次?那么下面的案例呢 for (int i = 0; i < s.toCharArray().length; i++) { .... } for(int i=0;i
for (char c : s.toCharArray()) {
....
}
我想知道s.tocharray()
是只执行一次还是执行s.length
次?那么下面的案例呢
for (int i = 0; i < s.toCharArray().length; i++) {
....
}
for(int i=0;i
受评论启发,进行了一些测试: 案例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);
String s=“dfsdfjglsdlghsl”;
对于(int i=0;i<25;i++){
s+=s;
}
长启动时间=System.nanoTime();
for(char c:s.toCharArray()){
int i=0;
}
long end_time=System.nanoTime();
双重执行时间=(结束时间-开始时间)/1e6;
系统输出打印LN(执行时间);
案例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);
String s=“dfsdfjglsdlghsl”;
对于(int i=0;i<25;i++){
s+=s;
}
长启动时间=System.nanoTime();
char[]carrays=s.toCharArray();
用于(字符c:carrays){
int i=0;
}
long end_time=System.nanoTime();
双重执行时间=(结束时间-开始时间)/1e6;
系统输出打印LN(执行时间);
几乎一样。因此,在第一种情况下,s.tocharray()
只应执行一次。根据,数组类型上的增强for语句:
L1: L2: ... Lm:
for ({VariableModifier} TargetType Identifier : Expression) {
Statement
}
相当于以下基本for语句:
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
{VariableModifier} TargetType Identifier = #a[#i];
Statement
}
相当于:
T[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i++) {
char c = cs[i];
// ...
}
s.tocharray()
在循环的每次迭代之前执行。这是不可取的,因为它创建了一个新的长度数组s.length()
,将字符复制到该数组中,然后获取数组的长度并丢弃数据
由于循环执行s.length()
次,因此该循环在字符串长度上至少是二次的
使用它在计算上要便宜得多:
for (int i = 0; i < s.length(); i++) {
for(int i=0;i
它在字符串长度上是线性的。根据,数组类型上的增强for语句:
L1: L2: ... Lm:
for ({VariableModifier} TargetType Identifier : Expression) {
Statement
}
相当于以下基本for语句:
T[] #a = Expression;
L1: L2: ... Lm:
for (int #i = 0; #i < #a.length; #i++) {
{VariableModifier} TargetType Identifier = #a[#i];
Statement
}
相当于:
T[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i++) {
char c = cs[i];
// ...
}
s.tocharray()
在循环的每次迭代之前执行。这是不可取的,因为它创建了一个新的长度数组s.length()
,将字符复制到该数组中,然后获取数组的长度并丢弃数据
由于循环执行s.length()
次,因此该循环在字符串长度上至少是二次的
使用它在计算上要便宜得多:
for (int i = 0; i < s.length(); i++) {
for(int i=0;i
它在字符串长度上是线性的。它只执行一次。您可以找到增强型for循环的等效基本for循环(搜索“否则,表达式必须具有数组类型,T[])。在第二个示例中,
s.tocharray().length
在每次执行循环时都会被调用。这很不幸,因为它每次都会将字符串复制到一个新数组中,这使得for循环的字符串长度至少是二次的。它在功能上也相当于常量时间表达式s.length()
;我建议使用后者。+1表示Any的注释,我认为可以将其转换为答案。我的注释是:在调试器中执行此操作,并设置断点以观察Andy的声明。并且,它只执行一次。您可以找到增强型for循环的等效基本for循环(搜索“否则,表达式必须具有数组类型T[]”。在第二个示例中,s.tocharray().length
在每次执行循环时都会被调用。这很不幸,因为它每次都会将字符串复制到一个新数组中,这使得for循环的字符串长度至少是二次的。它在功能上也相当于常量时间表达式s.length()
;我建议使用后者。+1表示Any的评论,我认为这可以转化为答案。我的评论是:在调试器中执行此操作,并设置断点以观察Andy的声明。以及。