Добавить символ в строку в заданной позиции

Добавить символ в строку в заданной позиции

1. Вступление

В этом кратком руководстве мыdemonstrate how to add a character at any given position in a String in Java.

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

Поскольку класс String -final and immutable, функция должна возвращать новыйString с добавленным символом.

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

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

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

Наконец, мы строим желаемыйString из этого массива.

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. Он подготавливаетString путем объединения:

  1. Подстрока исходногоString перед позицией

  2. Новый персонаж

  3. Подстрока исходногоString после позиции

public String addChar(String str, char ch, int position) {
    return str.substring(0, position) + ch + str.substring(position);
}

Хотя приведенный выше код более читабелен,it has a downside in that it creates a number of temporary objects to determine the result. ПосколькуString является неизменяемым классом, каждый вызов его методаsubstring() создает новый экземплярString.

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

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

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

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, чтобы вставить символ в позицию. Он выделяет тот же объем памяти, что и исходныйString, но для создания места для нового символа базовый массив сдвигает следующие символы на 1 позицию.

Хотя использованиеStringBuilder может быть медленнее, у него нет нагрузки на память, связанной с инициализацией временных объектов. We also end up with code that is simple and readable.

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

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

Предпочтительный способ реализации решения - использоватьthe StringBuilder class – as it’s simple, less bug-prone and offers good and stable performance.

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