Скажем, у меня есть эта функция в 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, который вы написали. – user2336315
Я считаю, что в вашем случае затраты времени будут практически одинаковыми. В таком случае я бы выбрал удобочитаемость, т. Е. Дважды использовал вызов метода. Я думаю, что сохранение ценности имеет смысл, когда вызов метода имеет тенденцию быть медленным, и мы гарантируем, что сохраненная ценность не может измениться между ними, и есть причина сомневаться в том, что оптимизатор Java не будет обрабатывать ее самостоятельно. –
['ConcurrentLinkedQueue.size()'] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentLinkedQueue.html#size%28%29) - один из примеров, когда вы должен подумать дважды, прежде чем называть это в цикле, так как это O (N) – zapl