gpt4 book ai didi

java - 将 String.toCharArray() 放入 for 循环中是一个好习惯吗

转载 作者:行者123 更新时间:2023-11-30 02:50:19 25 4
gpt4 key购买 nike

我多次遇到如下代码:

for (char c : s.toCharArray()) {
....
}

我想知道是否 s.toCharArray()只执行一次或执行s.length次?那么下面的案例又如何呢?

for (int i = 0; i < s.toCharArray().length; 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);

情况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()在第一种情况下应该只执行一次。

最佳答案

根据JLS Sec 14.14.2 ,对数组类型的增强 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
}

所以:

for (char c : s.toCharArray()) {
// ...
}

相当于:

T[] cs = s.toCharArray();
for (int i = 0; i < cs.length; i++) {
char c = cs[i];
// ...
}

因此 s.toCharArray() 仅执行一次。

但是,在

for (int i = 0; i < s.toCharArray().length; i++) {

s.toCharArray() 在循环的每次迭代之前执行。这是不可取的,因为它创建了一个长度为 s.length() 的新数组,将字符复制到该数组中,然后获取数组的长度并丢弃数据。

由于循环执行 s.length() 次,因此该循环至少是字符串长度的二次方。

使用它的计算成本要低得多:

for (int i = 0; i < s.length(); i++) {

与字符串长度呈线性关系。

关于java - 将 String.toCharArray() 放入 for 循环中是一个好习惯吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38883210/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com