Добавете символ към низ в дадена позиция

1. Въведение

В този бърз урок ще демонстрираме как да добавите символ на която и да е позиция в String в Java .

Ще представим три изпълнения на проста функция, която заема оригиналния String, символ и позицията, където трябва да го добавим.

Тъй като класът String е окончателен и неизменим, функцията трябва да върне нов String с добавен символ.

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

Тук идеята е да се създаде нов масив от символи и да се копират символите от оригиналния низ преди дадената позиция.

След това поставяме новия символ на позицията и копираме останалите символи от оригиналния низ в следващите позиции на новия масив.

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

  1. Поднизът на оригиналния низ преди позицията
  2. Новият герой
  3. Поднизът на оригиналния низ след позицията
public String addChar(String str, char ch, int position) { return str.substring(0, position) + ch + str.substring(position); }

Въпреки че горният код е по-четим, той има недостатък, тъй като създава редица временни обекти за определяне на резултата. Тъй като 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 може да е по-бавно, то не носи тежестта на паметта за инициализиране на временни обекти. В крайна сметка получаваме и код, който е прост и четим.

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

В тази статия се фокусирахме върху няколко начина за добавяне на символ в обект String в Java . Видяхме, че изпълнението с помощта на символен масив предлага най-добра производителност и че с метода на поднизовете дава по-четим подход.

Предпочитаният начин за внедряване на решението е използването на класа StringBuilder - тъй като е прост, по-малко склонен към грешки и предлага добра и стабилна производителност .

Както обикновено, пълният изходен код за горния урок е достъпен в GitHub.