String.substring vs String []. Split
У меня есть строка с запятой, которая при вызове String.split(",")
возвращает размер массива около 60. В конкретном случае использования мне нужно только получить значение второго значения, которое будет возвращено из массива. Так, например, "Q,BAC,233,sdf,sdf,"
все, что я хочу, это значение строки после первого ','
и до второго ','
. Вопрос, который у меня есть для производительности, мне лучше разобрать его самостоятельно с помощью подстроки или с помощью метода split, а затем получить второе значение в массиве? Любой вход был бы оценен. Этот метод будет называться сотни раз в секунду, поэтому важно понимать наилучший подход к производительности и распределению памяти.
-Duncan
Ответы
Ответ 1
Так как String.Split
возвращает a string[]
, использование 60-way Split
приведет к примерно шестидесяти ненужным выделениям в строке. Split
проходит через всю вашу строку и создает шестьдесят новых объектов плюс сам объект массива. Из этих шестидесяти объектов вы держите ровно один, и пусть сборщик мусора справится с оставшимися 60.
Если вы вызываете это в узком цикле, подстрока определенно будет более эффективной: она проходит через часть вашей строки до второй запятой ,
, а затем создает один новый объект, который вы сохраняете.
String s = "quick,brown,fox,jumps,over,the,lazy,dog";
int from = s.indexOf(',');
int to = s.indexOf(',', from+1);
String brown = s.substring(from+1, to);
Вышеупомянутый печатает brown
Когда вы запускаете это несколько раз, substring
выигрывает по времени: 1.000.000 итераций Split
принимают 3.36s, а 1,000,000 итераций substring
принимают только 0,05 с. И это только с восемью компонентами в строке! Разница для шестидесяти компонентов будет еще более резкой.
Ответ 2
из-за чего итерации по всей строке, просто используйте substring()
и indexOf()
Ответ 3
Вам, конечно, лучше делать это вручную по двум причинам:
-
.split()
принимает строку как аргумент, но эта строка интерпретируется как Pattern
, а для вашего случая использования Pattern
является дорогостоящим;
- как вы говорите, вам нужен только второй элемент: алгоритм для захвата этого второго элемента достаточно прост, чтобы сделать это вручную.
Ответ 4
Я бы использовал что-то вроде:
final int first = searchString.indexOf(",");
final int second = searchString.indexOf(",", first+1);
String result= searchString.substring(first+1, second);
Ответ 5
Моим первым наклонением было бы найти индекс первой и второй запятых и взять подстроку.
Единственный реальный способ сказать наверняка - это проверить каждый в вашем конкретном сценарии. Разрыв соответствующего секундомера и измерение двух.