Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将String.toCharArray()放入for循环是一种好做法吗_Java_String_Char - Fatal编程技术网

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的声明。以及。