Добавить символ в строку в заданной позиции
Мы представим три реализации простой функции, которая принимает исходную строку, символ и позицию, в которую нам нужно ее добавить.
Поскольку класс 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 .
- 1. Введение
- 2. Использование массива символов
- 3. Использование метода подстроки
- 4. Использование StringBuilder
- 5. Вывод
Как добавить символ к строке?
то есть, код if (number.length() != 4) выполняться не будет.
Однако, если задача в том, чтобы дополнить строку символами нуля ‘0’ , поддерживая длину строки кратной n (4) , следует вычислить нужное число нулей при помощи операции % .
public static String addZeros(String input, int n)
int n = 4; String input = addZeros("3254151235468745112236592", n); char[] chars = input.toCharArray(); for (int i = 0; i
Исходная строка из 25 символов дополнена 3 нулями
3254 1512 3546 8745 1122 3659 2000
Также при работе с изменяемыми строками лучше использовать StringBuilder / StringBuffer , а не «низкоуровневое» копирование массивов.
Как добавить символ к строке java
Для соединения строк можно использовать операцию сложения («+»):
String str1 = "Java"; String str2 = "Hello"; String str3 = str1 + " " + str2; System.out.println(str3); // Hello Java
При этом если в операции сложения строк используется нестроковый объект, например, число, то этот объект преобразуется к строке:
String str3 = "Год " + 2015;
Фактически же при сложении строк с нестроковыми объектами будет вызываться метод valueOf() класса String. Данный метод имеет множество перегрузок и преобразует практически все типы данных к строке. Для преобразования объектов различных классов метод valueOf вызывает метод toString() этих классов.
Другой способ объединения строк представляет метод concat() :
String str1 = "Java"; String str2 = "Hello"; str2 = str2.concat(str1); // HelloJava
Метод concat() принимает строку, с которой надо объединить вызывающую строку, и возвращает соединенную строку.
Еще один метод объединения — метод join() позволяет объединить строки с учетом разделителя. Например, выше две строки сливались в одно слово «HelloJava», но в идеале мы бы хотели, чтобы две подстроки были разделены пробелом. И для этого используем метод join() :
String str1 = "Java"; String str2 = "Hello"; String str3 = String.join(" ", str2, str1); // Hello Java
Метод join является статическим. Первым параметром идет разделитель, которым будут разделяться подстроки в общей строке, а все последующие параметры передают через запятую произвольный набор объединяемых подстрок — в данном случае две строки, хотя их может быть и больше
Извлечение символов и подстрок
Для извлечения символов по индексу в классе String определен метод char charAt(int index) . Он принимает индекс, по которому надо получить символов, и возвращает извлеченный символ:
String str = "Java"; char c = str.charAt(2); System.out.println(c); // v
Как и в массивах индексация начинается с нуля.
Если надо извлечь сразу группу символов или подстроку, то можно использовать метод getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) . Он принимает следующие параметры:
- srcBegin : индекс в строке, с которого начинается извлечение символов
- srcEnd : индекс в строке, до которого идет извлечение символов
- dst : массив символов, в который будут извлекаться символы
- dstBegin : индекс в массиве dst, с которого надо добавлять извлеченные из строки символы
String str = "Hello world!"; int start = 6; int end = 11; char[] dst=new char[end - start]; str.getChars(start, end, dst, 0); System.out.println(dst); // world
Сравнение строк
Для сравнения строк используются методы equals() (с учетом регистра) и equalsIgnoreCase() (без учета регистра). Оба метода в качестве параметра принимают строку, с которой надо сравнить:
String str1 = "Hello"; String str2 = "hello"; System.out.println(str1.equals(str2)); // false System.out.println(str1.equalsIgnoreCase(str2)); // true
В отличие от сравнения числовых и других данных примитивных типов для строк не применяется знак равенства ==. Вместо него надо использовать метод equals() .
Еще один специальный метод regionMatches() сравнивает отдельные подстроки в рамках двух строк. Он имеет следующие формы:
boolean regionMatches(int toffset, String other, int oofset, int len) boolean regionMatches(boolean ignoreCase, int toffset, String other, int oofset, int len)
Метод принимает следующие параметры:
- ignoreCase : надо ли игнорировать регистр символов при сравнении. Если значение true , регистр игнорируется
- toffset : начальный индекс в вызывающей строке, с которого начнется сравнение
- other : строка, с которой сравнивается вызывающая
- oofset : начальный индекс в сравниваемой строке, с которого начнется сравнение
- len : количество сравниваемых символов в обеих строках
String str1 = "Hello world"; String str2 = "I work"; boolean result = str1.regionMatches(6, str2, 2, 3); System.out.println(result); // true
В данном случае метод сравнивает 3 символа с 6-го индекса первой строки («wor») и 3 символа со 2-го индекса второй строки («wor»). Так как эти подстроки одинаковы, то возвращается true .
И еще одна пара методов int compareTo(String str) и int compareToIgnoreCase(String str) также позволяют сравнить две строки, но при этом они также позволяют узнать больше ли одна строка, чем другая или нет. Если возвращаемое значение больше 0, то первая строка больше второй, если меньше нуля, то, наоборот, вторая больше первой. Если строки равны, то возвращается 0.
Для определения больше или меньше одна строка, чем другая, используется лексикографический порядок. То есть, например, строка «A» меньше, чем строка «B», так как символ ‘A’ в алфавите стоит перед символом ‘B’. Если первые символы строк равны, то в расчет берутся следующие символы. Например:
String str1 = "hello"; String str2 = "world"; String str3 = "hell"; System.out.println(str1.compareTo(str2)); // -15 - str1 меньше чем strt2 System.out.println(str1.compareTo(str3)); // 1 - str1 больше чем str3
Поиск в строке
Метод indexOf() находит индекс первого вхождения подстроки в строку, а метод lastIndexOf() — индекс последнего вхождения. Если подстрока не будет найдена, то оба метода возвращают -1:
String str = "Hello world"; int index1 = str.indexOf('l'); // 2 int index2 = str.indexOf("wo"); //6 int index3 = str.lastIndexOf('l'); //9
Метод startsWith() позволяют определить начинается ли строка с определенной подстроки, а метод endsWith() позволяет определить заканчивается строка на определенную подстроку:
String str = "myfile.exe"; boolean start = str.startsWith("my"); //true boolean end = str.endsWith("exe"); //true
Замена в строке
Метод replace() позволяет заменить в строке одну последовательность символов на другую:
String str = "Hello world"; String replStr1 = str.replace('l', 'd'); // Heddo wordd String replStr2 = str.replace("Hello", "Bye"); // Bye world
Обрезка строки
Метод trim() позволяет удалить начальные и конечные пробелы:
String str = " hello world "; str = str.trim(); // hello world
Метод substring() возвращает подстроку, начиная с определенного индекса до конца или до определенного индекса:
String str = "Hello world"; String substr1 = str.substring(6); // world String substr2 = str.substring(3,5); //lo
Изменение регистра
Метод toLowerCase() переводит все символы строки в нижний регистр, а метод toUpperCase() — в верхний:
String str = "Hello World"; System.out.println(str.toLowerCase()); // hello world System.out.println(str.toUpperCase()); // HELLO WORLD
Split
Метод split() позволяет разбить строку на подстроки по определенному разделителю. Разделитель — какой-нибудь символ или набор символов передается в качестве параметра в метод. Например, разобьем текст на отдельные слова:
String text = «FIFA will never regret it»; String[] words = text.split(» «); for(String word : words)
В данном случае строка будет разделяться по пробелу. Консольный вывод:
FIFA will never regret it