Рубрики
Без рубрики

Эффективная Java: Остерегайтесь производительности конкатенации строк

Погружение в главу 63 “Эффективная Java”. Помеченный как java, эффективный, строка, архитектура.

Эффективный обзор Java (Серия из 78 частей)

Атрибутом типа String является то, что они являются неизменяемыми. Это позволяет использовать ряд хороших качеств. Другим атрибутом типа String является то, что Java предоставляет некоторый синтаксический сахар для объединения Строк с помощью оператора + . Это очень полезная способность, но объединение этих двух возможностей, неизменяемости и простого уплотнения, может привести к случайным проблемам с производительностью. Давайте рассмотрим пример:

public String concatenateStrings(int numberOfIterations) {
  String result = "";
  for (int i=0; i < numberOfIterations; i++) {
    result += randomStringOfLength(m);
  }
  return result;
}

При низком значении количество итераций это может оказаться прекрасным. По мере увеличения количества итераций стоимость резко возрастает. Это связано с тем, что Строка s не может быть изменена и должна быть скопирована. Это не только требует больших вычислительных мощностей, но и создает много мусора для очистки сборщика мусора. Сравните это с гораздо более производительной версией:

public String concatenateStrings(int numberOfIterations) {
  StringBuilder result = new StringBuilder();
  for (int i=0; i < numberOfIterations; i++) {
    result.append(randomStringOfLength(m));
  }
  return result.toString();
}

Этот код использует изменяемый держатель для сбора Строка s, чтобы она могла объединить их все сразу.

Итак, когда мы должны использовать конкатенацию строк и когда мы должны использовать StringBuilder . Хорошее эмпирическое правило – использовать StringBuilder при объединении в цикле. При объединении статического числа строк с производительность не улучшится и не ухудшится по сравнению с вашим первоначальным тестированием, поэтому вы не будете удивлены проблемами с производительностью.

Эффективный обзор Java (Серия из 78 частей)

Оригинал: “https://dev.to/kylec32/effective-java-beware-the-performance-of-string-concatenation-5e7l”