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