GAnd,
Цитата (GAnd @ 15.8.2017)
Как думаешь, на собеседовании лучше писать (если до этого дойдет) прямолинейный удобочитаемый код или можно применять "хитрые" решения
Я думаю, что если бы кандидат написал приведенный тобой код для решения задачи, то наш разговор продлился бы недолго. Для новичков могу порекомедовать простое правило - один стейтмент (инструция) = одно действие. У тебя здесь 1 стеймент = хренова туча действий, в которых без 100 грамм не разберешься. И уж тем более, без описания задачи в жизнь не догадаешься, что должен делать этот код.
Для примера мое решение этой же задачи (написано спустя где-то 4-5 месяцев изучения языка)
public boolean catDog(String str) {
int dogcount = 0;
int catcount = 0;
String dogstr = str;
String catstr = str;
while(dogstr.contains("dog")){
dogstr = dogstr.replaceFirst("dog","");
dogcount++;
}
while(catstr.contains("cat")){
catstr = catstr.replaceFirst("cat","");
catcount++;
}
if(dogcount == catcount) {
return true;
}
return false;
}
Разумеется, оно тоже далеко от оптимального (можно упростить и сократить минимум в 2 раза), но уж точно куда понятнее.
Цитата (GAnd @ 16.8.2017)
современные реализации настолько хорошо оптимизируют выполнение кода, что скорость выполнения программы на разогретой java-машине не уступает нативному коду.
Убогому коду никакие оптимизаторы не помогут.
Далее
Цитата (GAnd @ 16.8.2017)
которое однозначно эффективнее стандартного решения
Ну, откуда взялось это "стандартное" решение?) Я бы его таковым не назвал.
По поводу различных замеров перфоманса и оптимизаций - об этом лучше вообще не думать, особенно если нету более глубоких знаний. Например,
Цитата (GAnd @ 16.8.2017)
при любом изменении строки создается новый объект (т.е. выделяется память, копируются данные и т.д.)
Это не совсем
так.
Цитата (GAnd @ 16.8.2017)
старой переменной присваивается ссылка на новый объект, в то время как старый "теряется" <...> и со временем будет уничтожен сборщиком мусора.
Опять же, это не совсем
корректно.
Да и вообще, для проверки перформанса стоит использовать специально предназначенные для этого тулзы, например JMH.
spaun, насколько я знаю, в стандартной библиотеке KMP нет. В сторонних наверняка можно найти при желании.
Я тебе предлагаю написать функцию по подсчету числа вхождений. Как это влияет на эффективность? Напишешь с копированием, будет чуть медленнее, напишешь без - чуть быстрее. Единственный минус - вызвать " лишнюю" функцию два раза. Но это практически не значимо, это не какой-нибудь HFT, где важны микросекунды (и не нужна java).
Ну и всегда приоритет такой, что код должен быть вначале написан максимально понятно. А потом ты посмотришь на производительность, если не устроит - будешь думать, как бы ускориться. И наверняка выйдет так, что тормозит сильнее всего не этот несчастный поиск подстроки в строке, а что-то совершенно другое.