«1. Введение

В этом кратком руководстве мы покажем, как добавить символ в любую заданную позицию в строке в Java.

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

Поскольку класс String является окончательным и неизменяемым, функция должна возвращать новую строку с добавленным символом.

2. Использование массива символов

Здесь идея состоит в том, чтобы создать новый массив символов и скопировать символы из исходной строки перед заданной позицией.

После этого мы помещаем новый символ в позицию и копируем остальные символы из исходной строки в последующие позиции нового массива.

Наконец, мы создаем нужную строку из этого массива.

public String addChar(String str, char ch, int position) {
    int len = str.length();
    char[] updatedArr = new char[len + 1];
    str.getChars(0, position, updatedArr, 0);
    updatedArr[position] = ch;
    str.getChars(position, len, updatedArr, position + 1);
    return new String(updatedArr);
}

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

3. Использование метода substring

Более простой и высокоуровневый подход заключается в использовании метода substring() класса String. Он подготавливает строку путем конкатенации:

  1. The substring of the original String before the position
  2. The new character
  3. The substring of the original String after the position
public String addChar(String str, char ch, int position) {
    return str.substring(0, position) + ch + str.substring(position);
}

Хотя приведенный выше код более удобочитаем, у него есть недостаток, заключающийся в том, что он создает ряд временных объектов для определения результата. Поскольку String является неизменяемым классом, каждый вызов его метода substring() создает новый экземпляр String.

Наконец, когда мы объединяем части, компилятор создает объект StringBuilder для добавления их одну за другой. Каждый объект String и StringBuilder выделяет отдельные области памяти для своего внутреннего массива символов.

Эта реализация также должна трижды копировать все символы из одного массива в другой.

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

4. Использование StringBuilder

StringBuilder — это служебный класс, предоставляемый библиотекой Java для создания объектов String и управления ими различными способами.

Мы можем реализовать ту же функциональность, используя метод insert() класса StringBuilder:

public String addChar(String str, char ch, int position) {
    StringBuilder sb = new StringBuilder(str);
    sb.insert(position, ch);
    return sb.toString();
}

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

Хотя использование StringBuilder может быть медленнее, он не требует памяти для инициализации временных объектов. Мы также получаем простой и читаемый код.

5. Заключение

В этой статье мы сосредоточились на нескольких способах добавления символа в объект String в Java. Мы видели, что реализация с использованием массива символов обеспечивает наилучшую производительность, а реализация с использованием метода подстроки обеспечивает более читаемый подход.

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

Как обычно, полный исходный код приведенного выше руководства доступен на GitHub.