Управление строками, функции для работы со строками в Java. Часть 2

13-11-04 Java String 1

Продолжаем изучение строк в 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(), всегда больше или равна длине строки (обычно больше) и автоматически будет увеличина при необходимости.

Конструкторы StringBuilder
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 Java
StringBuilder Java

Класс StringBuilder содержит несколько методов относящихся к длине и емкости, которых нет в классе String:

Length и Capacity функции
Функция Описание
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
Функция Описание
StringBuilder append(boolean b)
StringBuilder append(char c)
StringBuilder append(char[] str)
StringBuilder append(char[] str, int offset, int len)
StringBuilder append(double d)
StringBuilder append(float f)
StringBuilder append(int i)
StringBuilder append(long lng)
StringBuilder append(Object obj)
StringBuilder append(String s)
Добавляет аргумент в конец строки stringbuilder’а. Предварительно данные конвертируются в строку.
StringBuilder delete(int start, int end)
StringBuilder deleteCharAt(int index)
Первый метод удаляет подпоследовательность начиная с from до end-1 (включительно) в последовательности символов StringBuilder‘а. Второй — удаляет символ, индекс которого равен index.
StringBuilder insert(int offset, boolean b)
StringBuilder insert(int offset, char c)
StringBuilder insert(int offset, char[] str)
StringBuilder insert(int index, char[] str, int offset, int len)
StringBuilder insert(int offset, double d)
StringBuilder insert(int offset, float f)
StringBuilder insert(int offset, int i)
StringBuilder insert(int offset, long lng)
StringBuilder insert(int offset, Object obj)
StringBuilder insert(int offset, String s)
Вставляет второй аргумент в stringbuilder. Первый аргумент задает позицию символа перед которым будет вставлены данные. Перед вставкой данные конвертируются в строку.
StringBuilder replace(int start, int end, String s)
void setCharAt(int index, char c)
Заменяет заданные символы в строке.
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().

Хочешь получать статьи на почту?

Подпишись на обновления!
* Ваш email не будет разглашен/продан. Вы сможете отписаться в любое время.

1 Комментарий

  1. Curious:

    Великолепная статья по StringBuilder, очень приятно было почитать, благодарствую.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *