【发布时间】:2014-02-07 23:36:16
【问题描述】:
假设我在java中有这个函数
public static Character firstNonrepeatedChar(String in) {
int[] repeated = new int[256];
for(int i=0; i<256; i++){
repeated[i] = 0;
}
// First time calling in.length()
for(int j=0; j<in.length(); j++){
repeated[in.charAt(j)]++;
}
// Second time calling in.length()
// I could have used "int length = in.length() and use this variable in this second loop"
for(int j=0; j<in.length(); j++){
if(repeated[in.charAt(j)] == 1)
return in.charAt(j);
}
return null;
}
如您所见,我使用了 in.length() 两次。另一种方法可能是将 in.length() 保存在变量中并使用该变量。有人能告诉我这有多大的不同吗?我知道如果我想将该值使用 100 次,我应该将该值保存在一个变量中,但在这种情况下,我们要决定是再调用一个函数还是使用一个整数变量。
【问题讨论】:
-
length()方法只返回一个字段的值。所以它是O(1)。我看到的唯一用例是可维护性。如果您想为字符串的一半运行循环,您只需更改用于存储长度的变量的值,而不是在您编写的所有 for 循环中进行这些更改。 -
我相信在您的情况下,时间成本几乎相同。在这种情况下,我会选择可读性,即使用两次方法调用。我认为当方法调用趋于缓慢时存储值是有意义的,并且我们保证保留的值不可能在两者之间发生变化,并且有理由怀疑 Java 优化器不会自行处理它。
-
ConcurrentLinkedQueue.size()是一个例子,你应该在循环调用它之前三思而后行,因为这是 O(N) -
+1 你偷了我的问题 :) (不是关于 length() 而是一般来说:为什么人们通常把它放在
for()而不是保存和使用这个值?)
标签: java optimization memory-management