我想知道哪个好。我正在写一个 for 循环。在条件部分我使用 str.length()。我想知道这是个好主意。我还可以将值分配给整数变量并在循环中使用它。
哪一个是合适/更好的方法?
我想知道哪个好。我正在写一个 for 循环。在条件部分我使用 str.length()。我想知道这是个好主意。我还可以将值分配给整数变量并在循环中使用它。
哪一个是合适/更好的方法?
如果您str.length()
在代码中使用不止一次或两次,为了简洁起见,将其提取到本地 var 是合乎逻辑的。至于性能,它很可能完全相同,因为 JIT 编译器将内联该调用,因此本机代码就像您使用了局部变量一样。
在“你真的不应该这样做”的意义上,在循环条件表达式中调用函数没有明显的缺点。在调用具有副作用的函数时要小心,但在某些情况下即使这样也是可以接受的。
将函数调用移出循环(包括循环条件表达式)有三个主要原因:
表现。该函数可能(取决于JIT编译器)在循环的每次迭代中被调用,这会花费您的执行时间。特别是如果函数的代码在第一次执行后具有比 O(1) 更高的复杂度,这将增加执行时间。多少完全取决于所讨论的功能究竟是做什么的以及它是如何实现的。
副作用。如果该函数有任何副作用,则可能(将)重复执行。这可能正是您想要的,但您需要意识到这一点。副作用基本上是在被调用的函数之外可以观察到的东西。例如,磁盘或网络 I/O 通常被认为是副作用。简单地对已有数据执行计算的函数通常是纯函数。
代码清晰。诚然str.length()
,不是很长,但是如果您有一个基于循环条件中的函数调用的复杂计算,那么代码清晰度很容易受到影响。由于这个原因,将循环终止条件计算移出循环条件表达式本身可能是有利的。但是,要小心唤醒沉睡的野兽;确保重构的代码实际上更具可读性。
因为str.length()
这并不重要,除非你真的在追求你可以获得的最后一点性能,特别是正如其他回答者所指出的那样,String#length()是一个 O(1) 复杂性操作。特别是在一般情况下,如果您需要额外的性能,请考虑引入一个变量来保存函数调用的结果并与之进行比较,而不是重复调用函数。
就个人而言,我会先考虑代码的清晰度,然后再担心微优化,比如在哪里放置特定的函数调用。但是,如果您已经完成了所有其他工作并且仍然需要从代码中获得更多性能,那么将函数调用从条件表达式中移出并使用局部变量(最好是原始类型)是值得考虑的事情。但是,如果您担心这一点,您可能会通过考虑不同的算法获得更大的收益。(你真的需要以你正在做的方式迭代字符串吗?没有其他方法可以做你所追求的吗?)
通常没关系。使用使您的代码更清晰的任何一种。
如果一个值将被多次使用,那么将其分配给局部变量有两个优点:
注意:此建议仅适用于纯函数。如果函数有副作用,或者每次可能返回不同的值(如Math.random()
),您需要更加小心 - 在这些情况下,您需要更仔细地考虑多个函数调用的效果。
由于长度存储为成员,因此调用length
成本 O(1) - 这是一个恒定的操作,不要浪费时间考虑这件事的复杂性和性能。
两者之间完全没有区别但是假设如果 str.length 发生变化,那么在 for 循环中您需要手动更改值
例如字符串 str="hi"; 所以在for循环中你这样写
for int i=0;i<str.length();i++)
{
}
或者
for int i=0;i<2;i++)
{
}
现在假设您要更改 str String str="hi1";
所以在for循环中
for int i=0;i<3;i++)
{
}
所以我建议你去str.length()
如果你str.length
总是使用这将被评估。最好将此值分配给变量并在 for 循环中使用它。
for(int i=0; i<str.length;i++){ // str.length always evaluvated
}
int k=str.length; // only one time evaluvated
for(int i=0;i<k;i++){
}
如果您担心性能,您可以使用第二种方法。
如果您str.length()
在代码中多次使用,则需要将其分配给另一个变量并使用它。否则你可以使用str.length()
它自己。
需要的理由
当我们调用一个方法时,每次将当前位置存储在一个DS(堆/栈)中,然后去对应的被调用方法进行操作,然后返回并从DS中检索当前位置并进行正常操作。这实际上正在发生。所以当我们在一个程序中做这么多次时,会导致多次出现上述情况。
因此,我们需要创建一个局部变量并分配给它,并在程序中需要的地方使用。