Управление строками, функции для работы со строками в Java. Часть 2
Продолжаем изучение строк в Java. Основы работы со строками можно посмотреть в уроке «Строки в Java».
Методы для сравнения строк
Класс String содержит методы для сравнения строк и частей строк. Следующая таблица описывает эти методы:
Метод | Описание |
---|---|
boolean endsWith(String suffix) boolean startsWith(String prefix) |
Возвращает true Если строка заканчивается или начинается с указанной подстроки. |
boolean startsWith(String prefix, int offset) | Возвращается true если переданная строка входит в исходную начиная с индекса offset. |
int compareTo(String anotherString) | Сравнивает строки лексикографически. Возвращает int:> 0, если строка болше переданной в параметре, = 0, если равны и < 0, если строка меньше переданной в параметре. |
int compareToIgnoreCase(String str) | То же самое, что и в предыдущей, но разница регистра игнорируется. |
boolean equals(Object anObject) | Возвращает true только если переданный объект типа String, представляет туже последовательность символов, что и исходный. |
boolean equalsIgnoreCase(String anotherString) | То же, что и в предыдущем, игнорируя регистр. |
boolean regionMatches(int toffset, String other, int ooffset, int len) | Проверяет, совпадает ли указанный регион строки с регионом переданной строки.Регион длиной len начинается c toffset для исходной строки и с ooffset для переданной строки. |
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len) | То же что и в предыдущем. Если первый аргумент true – регистр игнорируется при сравнении. |
boolean matches(String regex) | Возвращает true, если строка удовлетворяет переданному регулярному выражению (основы регулярных выражений) |
Следующая программа использует метод regionMatches для нахождения строк в другой строке:
public class RegionMatchesDemo { public static void main(String[] args) { String searchMe = "Green Eggs and Ham"; String findMe = "Eggs"; int searchMeLength = searchMe.length(); int findMeLength = findMe.length(); boolean foundIt = false; for (int i = 0; i <= (searchMeLength - findMeLength); i++) { if (searchMe.regionMatches(i, findMe, 0, findMeLength)) { foundIt = true; System.out.println(searchMe.substring(i, i + findMeLength)); break; } } if (!foundIt) System.out.println("No match found."); } }
Программа выведет Eggs.
Программа пробегает по строке символ за символом, для каждого символа программа вызывает метод regionMatches, передавая ему позицию символа, для поиска строки findMe.
Класс StringBuilder
Объекты типа StringBuilder
отличаются от объектов типа String
тем, что они могут быть изменены. По сути они представляют из себя массивы переменной длины, содержащие последовательность символов. Длина и содержание последовательности могут быть изменены вызовом соответствующих методов.
StringBuilder необходимо использовать в случаях, когда это поможет упростить код (пример ниже) или если это необходимо для лучшей производительности. Если вам необходимо объединить большое количество строк, использование StringBuilder будет более эффективным.
Length и Capacity
Класс StringBuilder
как и класс String
, имеет метод length(),
который возвращает длину последовательности символов объекта.
В отличие от строк, в StringBuilder, помимо длины есть capacity — количество символов под которое выделена память. Емкость (capacity), возвращаемая методом capacity()
, всегда больше или равна длине строки (обычно больше) и автоматически будет увеличина при необходимости.
Constructor | Description |
---|---|
StringBuilder() |
Создает пустой stringbuilder, с емкостью 16 символов. |
StringBuilder(CharSequence cs) |
Создает stringbuilder, содержащий заданную последовательность символов плюс дополнительно 16 пустых символов. |
StringBuilder(int initCapacity) |
Создает stringbuilder определенной емкости. |
StringBuilder(String s) |
Создет stringbuilder с заданной строкой. |
Например, следующий код:
StringBuilder sb = new StringBuilder(); sb.append("Greetings");
создаст string builder длиной 9 символов и емкостью 16:
Класс StringBuilder
содержит несколько методов относящихся к длине и емкости, которых нет в классе String
:
Функция | Описание |
---|---|
void setLength(int newLength) |
Задает длину последовательности символов. Если newLength меньше length() , последние символы будут отсечены. Если newLength больше length() , будут добавлены null-символы в конец последовательности. |
void ensureCapacity(int minCapacity) |
Гарантирует, что емкость будет не меньше указанного минимума. |
Некоторые операции (например, append()
, insert()
, или setLength()
) могут увеличить длину последовательности символов в stringbuilder’е , так что длина может оказаться больше текущей емкости. Когда это происходит — емкость автоматически увеличивается.
Функции StringBuilder
Основные функции StringBuilder
, которых нет в String
: append()
и insert()
, которые перегружены для приема разного типа данных. Каждый конвертирует аргумент в строку и добавляет её в строку stringbuilder’а. Метод append всегда добавляет символы в конец существующей последовательности, тогда как метод insert добавляет символы в указанное место.
Некоторые методы класса StringBuilder
.
Функция | Описание |
---|---|
StringBuilder append(boolean b) |
Добавляет аргумент в конец строки stringbuilder’а. Предварительно данные конвертируются в строку. |
StringBuilder delete(int start, int end) |
Первый метод удаляет подпоследовательность начиная с from до end-1 (включительно) в последовательности символов StringBuilder ‘а. Второй — удаляет символ, индекс которого равен index . |
StringBuilder insert(int offset, boolean b) |
Вставляет второй аргумент в stringbuilder. Первый аргумент задает позицию символа перед которым будет вставлены данные. Перед вставкой данные конвертируются в строку. |
StringBuilder replace(int start, int end, String s) |
Заменяет заданные символы в строке. |
StringBuilder reverse() |
Переворачивает строку в stringbuilder’е. |
String toString() |
Возвращает строку, которая хранится в билдере. |
Вы можете использовать любой метод класса String
на объекте класса StringBuilder
предварительно сконвертировав его в строку методом toString()
. Затем из строки можно опять сделать stringbuilder, используя конструктор: StringBuilder(String str)
.
Пример
Программа StringDemo,
которую мы рассматривали в предыдущих уроках Java — пример того, когда использование StringBuilder
вместо String
делает программу проще.
StringDemo
переворачивает палиндром:
public class StringDemo { public static void main(String[] args) { String palindrome = "Dot saw I was Tod"; int len = palindrome.length(); char[] tempCharArray = new char[len]; char[] charArray = new char[len]; for (int i = 0; i < len; i++) { tempCharArray[i] = palindrome.charAt(i); } for (int j = 0; j < len; j++) { charArray[j] = tempCharArray[len - 1 - j]; } String reversePalindrome = new String(charArray); System.out.println(reversePalindrome); } }
Программа выведет:
doT saw I was toD
Для того чтобы перевернуть сроку программа сначала конвертирует строку в массив символов (первый цикл), далее переворачивает массив и обратно конвертирует массив в строку.
Если вы конвертируете строку palindrome
в stringbuilder, вы сможете использовать метод reverse()
класса StringBuilder
. Код станет чище и проще читаемым:
public class StringBuilderDemo { public static void main(String[] args) { String palindrome = "Dot saw I was Tod"; StringBuilder sb = new StringBuilder(palindrome); sb.reverse(); System.out.println(sb); } }
Вывод:
doT saw I was toD
Обратите внимание, что в функцию println()
мы передаем StringBuilder:
System.out.println(sb);
Метод sb.toString()
будет неявно вызван, как и у любого другого объекта, переданного в println()
.
Великолепная статья по StringBuilder, очень приятно было почитать, благодарствую.