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()
класса String
. Он подготавливает строку
путем объединения:
- Подстрока исходной
строки
перед позицией - Новый персонаж
- Подстрока исходной
строки
после позиции
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 .