说我有(Java)
String word = args[0];
for (int i = 0; i < word.length(); i++) {}
我知道字符串上的.length()方法并不一定代价高昂,但只是为了确认:这会在for循环的每次传递中重新计算word.length()吗?定义
会更好吗?int length = word.length;
并使用i&lt;长度作为循环中的条件?
答案 0 :(得分:3)
每次拨打String
时,word.length()
的长度都是不。那是因为String
类在创建时将长度存储为字段。
如果您看到length()
类java.lang.String
方法的代码,则只包含以下内容:
public int length() {
return value.length;
}
这样做
int length = word.length();
for (int i = 0; i < length; i++) {}
完成后会有相同的表现:
int length = word.length();
for (int i = 0; i < word.length(); i++) {}
还要注意前一个代码将调用移到循环外部,基本上不需要方法调用。但是,这将是一个微不足道的性能提升。
答案 1 :(得分:2)
Java字符串是常量,并且length()方法实现得很快(与c中的strlen不同)。那段代码没问题。
尽管如此,避免这种恐惧的一种方法是数到零。它稍快一点,因为你只进行一次方法调用,比较0比非零便宜。 边缘更便宜。
for (int i = word.length() - 1; i >= 0; --i) ...
另一个人正在使用CharacterIterator,但这样做太过分了:
CharacterIterator iter = new StringCharacterIterator(word);
for(char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) ...