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

Моим первым наклонением было бы найти индекс первой и второй запятых и взять подстроку.

Единственный реальный способ сказать наверняка - это проверить каждый в вашем конкретном сценарии. Разрыв соответствующего секундомера и измерение двух.