Как работает stringbuilder java
Перейти к содержимому

Как работает stringbuilder java

  • автор:

# StringBuilder

Java StringBuilder class is used to create mutable (modifiable) string. The Java StringBuilder class is same as StringBuffer class except that it is non-synchronized. It is available since JDK 1.5.

# Comparing StringBuffer, StringBuilder, Formatter and StringJoiner

The StringBuffer , StringBuilder , Formatter and StringJoiner classes are Java SE utility classes that are primarily used for assembling strings from other information:

This example shows how StringBuilder is can be used:

(The StringBuffer class is used the same way: just change StringBuilder to StringBuffer in the above)

The StringBuffer and StringBuilder classes are suitable for both assembling and modifying strings; i.e they provide methods for replacing and removing characters as well as adding them in various. The remining two classes are specific to the task of assembling strings.

Here are some typical examples of Formatter usage:

The StringJoiner class is not ideal for the above task, so here is an example of a formatting an array of strings.

The use-cases for the 4 classes can be summarized:

  • StringBuilder suitable for any string assembly OR string modification task.
  • StringBuffer use (only) when you require a thread-safe version of StringBuilder .
  • Formatter provides much richer string formatting functionality, but is not as efficient as StringBuilder . This is because each call to Formatter.format(. ) entails:
  • parsing the format string,
  • creating and populate a varargs array, and
  • autoboxing any primitive type arguments.

# Repeat a String n times

Problem: Create a String containing n repetitions of a String s .

The trivial approach would be repeatedly concatenating the String

This creates n new string instances containing 1 to n repetitions of s resulting in a runtime of O(s.length() * n²) = O(s.length() * (1+2+. +(n-1)+n)) .

To avoid this StringBuilder should be used, which allows creating the String in O(s.length() * n) instead:

# Syntax
# Remarks

Creating a new StringBuilder with type char as a parameter would result in calling the constructor with argument int capacity and not the one with argument String string :

Обработка строк в Java. Часть I: String, StringBuffer, StringBuilder

Что вы знаете о обработке строк в Java? Как много этих знаний и насколько они углублены и актуальны? Давайте попробуем вместе со мной разобрать все вопросы, связанные с этой важной, фундаментальной и часто используемой частью языка. Наш маленький гайд будет разбит на две публикации:

String

Строка — объект, что представляет последовательность символов. Для создания и манипулирования строками Java платформа предоставляет общедоступный финальный (не может иметь подклассов) класс java.lang.String. Данный класс является неизменяемым (immutable) — созданный объект класса String не может быть изменен. Можно подумать что методы имеют право изменять этот объект, но это неверно. Методы могут только создавать и возвращать новые строки, в которых хранится результат операции. Неизменяемость строк предоставляет ряд возможностей:

  • использование строк в многопоточных средах (String является потокобезопасным (thread-safe) )
  • использование String Pool (это коллекция ссылок на String объекты, используется для оптимизации памяти)
  • использование строк в качестве ключей в HashMap (ключ рекомендуется делать неизменяемым)
Создание

Мы можем создать объект класса String несколькими способами:

https://amdy.su/wp-admin/options-general.php?page=ad-inserter.php#tab-8
1. Используя строковые литералы:

Строковый литерал — последовательность символов заключенных в двойные кавычки. Важно понимать, что всегда когда вы используете строковой литерал компилятор создает объект со значением этого литерала:

2. С помощью конструкторов:

Если копия строки не требуется явно, использование этих конструкторов нежелательно и в них нет необходимости, так как строки являются неизменными. Постоянное строительство новых объектов таким способом может привести к снижению производительности. Их лучше заменить на аналогичные инициализации с помощью строковых литералов.

Конструкторы могут формировать объект строки с помощью массива символов. Происходит копирование массива, для этого используются статические методы copyOf и copyOfRange (копирование всего массива и его части (если указаны 2-й и 3-й параметр конструктора) соответственно) класса Arrays, которые в свою очередь используют платформо-зависимую реализацию System.arraycopy.

Можно также создать объект строки с помощью массива байтов. Дополнительно можно передать параметр класса Charset, что будет отвечать за кодировку. Происходит декодирование массива с помощью указанной кодировки (если не указано — используется Charset.defaultCharset(), который зависит от кодировки операционной системы) и, далее, полученный массив символов копируется в значение объекта.

Ну и наконец-то конструкторы использующие объекты StringBuffer и StringBuilder, их значения (getValue()) и длину (length()) для создания объекта строки. С этими классами мы познакомимся чуть позже.

Приведены примеры наиболее часто используемых конструкторов класса String, на самом деле их пятнадцать (два из которых помечены как deprecated).

Длина

Важной частью каждой строки есть ее длина. Узнать ее можно обратившись к объекту String с помощью метода доступа (accessor method) length(), который возвращает количество символов в строке, например:

Конкатенация

Конкатенация — операция объединения строк, что возвращает новую строку, что есть результатом объединения второй строки с окончанием первой. Операция для объекта String может быть выполнена двумя способами:

1. Метод concat

Важно понимать, что метод concat не изменяет строку, а лишь создает новую как результат слияния текущей и переданной в качестве параметра. Да, метод возвращает новый объект String, поэтому возможны такие длинные «цепочки».

2. Перегруженные операторы «+» и «+=«

Это одни с немногих перегруженных операторов в Java — язык не позволяет перегружать операции для объектов пользовательских классов. Оператор «+» не использует метод concat, тут используется следующий механизм:

Используйте метод concat, если слияние нужно провести только один раз, для остальных случаев рекомендовано использовать или оператор «+» или StringBuffer / StringBuilder. Также стоит отметить, что получить NPE (NullPointerException), если один с операндов равен null, невозможно с помощью оператора «+» или «+=«, чего не скажешь о методе concat, например:

Форматирование

Класс String предоставляет возможность создания форматированных строк. За это отвечает статический метод format, например:

Методы

Благодаря множеству методов предоставляется возможность манипулирования строкой и ее символами. Описывать их здесь нет смысла, потому что Oracle имеет хорошие статьи о манипулировании и сравнении строк. Также у вас под рукой всегда есть их документация. Хотелось отметить новый статический метод join, который появился в Java 8. Теперь мы можем удобно объединять несколько строк в одну используя разделитель (был добавлен класс java.lang.StringJoiner, что за него отвечает), например:

Это не единственное изменение класса в Java 8. Oracle сообщает о улучшении производительности в конструкторе String(byte[], *) и методе getBytes().

Преобразование
1. Число в строку
2. Строку в число

StringBuffer

Строки являются неизменными, поэтому частая их модификация приводит к созданию новых объектов, что в свою очередь расходует драгоценную память. Для решения этой проблемы был создан класс java.lang.StringBuffer, который позволяет более эффективно работать над модификацией строки. Класс является mutable, то есть изменяемым — используйте его, если Вы хотите изменять содержимое строки. StringBuffer может быть использован в многопоточных средах, так как все необходимые методы являются синхронизированными.

Создание

Существует четыре способа создания объекта класса StringBuffer. Каждый объект имеет свою вместимость (capacity), что отвечает за длину внутреннего буфера. Если длина строки, что хранится в внутреннем буфере, не превышает размер этого буфера (capacity), то нет необходимости выделять новый массив буфера. Если же буфер переполняется — он автоматически становиться больше.

Модификация

В большинстве случаев мы используем StringBuffer для многократного выполнения операций добавления (append), вставки (insert) и удаления (delete) подстрок. Тут все очень просто, например:

Все остальные методы для работы с StringBuffer можно посмотреть в документации.

StringBuilder

StringBuilder — класс, что представляет изменяемую последовательность символов. Класс был введен в Java 5 и имеет полностью идентичный API с StringBuffer. Единственное отличие — StringBuilder не синхронизирован. Это означает, что его использование в многопоточных средах есть нежелательным. Следовательно, если вы работаете с многопоточностью, Вам идеально подходит StringBuffer, иначе используйте StringBuilder, который работает намного быстрее в большинстве реализаций. Напишем небольшой тест для сравнения скорости работы этих двух классов:

Спасибо за внимание. Надеюсь статья поможет узнать что-то новое и натолкнет на удаление всех пробелов в этих вопросах. Все дополнения, уточнения и критика приветствуются.

Знакомство со String, StringBuffer и StringBuilder в Java

Благодаря неизменности, хэшкод экземпляра класса String кэшируется. Его не нужно вычислять каждый раз, потому что значения полей объекта никогда не изменятся после его создания. Это дает высокую производительность при использовании данного класса в качестве ключа для HashMap .

Класс String можно использовать в многопоточной среде без дополнительной синхронизации.

Еще одна особенность класса String — для него перегружен оператор » + » в Java. Поэтому конкатенация (сложение) строк выполняется довольно просто:

Недостатки:

  • перевод строк в разные регистры;
  • извлечение подстрок;
  • конкатенация;
  • и т.д.

Класс StringBuffer

  • StringBuffer() — создаст пустой (не содержащий символов) объект
  • StringBuffer(String str) — создаст объект на основе переменной str (содержащий все символы str в той же последовательности)
  • delete(int start, int end) — удаляет подстроку символов начиная с позиции start , заканчивая end
  • deleteCharAt(int index) — удаляет символ в позиции index
  • insert(int offset, String str) — вставляет строку str в позицию offset . Метод insert также перегружен и может принимать различные аргументы
  • replace(int start, int end, String str) — заменит все символы начиная с позиции start до позиции end на str
  • reverse() — меняет порядок всех символов на противоположный substring(int start) — вернет подстроку, начиная с позиции start
  • substring(int start, int end) — вернет подстроку, начиная с позиции start до позиции end

Преимущества:

Как уже сказано, StringBuffer — изменяемый класс, поэтому при работе с ним не возникает такого же количества мусора в памяти, как со String. Поэтому если над строками проводится много модификаций, лучше использовать StringBuffer .

StringBuffer — потокобезопасный класс. Его методы синхронизированы, а экземпляры могут быть использованы несколькими потоками одновременно.

Недостатки:

Класс StringBuilder

Знакомство со String, StringBuffer и StringBuilder в Java - 2

StringBuilder в Java — класс, представляющий последовательность символов. Он очень похож на StringBuffer во всем, кроме потокобезопасности. StringBuilder предоставляет API, аналогичный API StringBuffer’a. Продемонстрируем это на уже знакомом примере, заменив объявление переменных со StringBufer’а на StringBuilder: Разница лишь в том, что StringBuffer потокобезопасен, и все его методы синхронизированы, а StringBuilder — нет. Это единственная особенность. StringBuilder в Java работает быстрее StringBuffer’а благодаря несинхронизированности методов. Поэтому в большинстве случаев, кроме многопоточной среды, лучше использовать для программы на Java StringBuilder. Резюмируем все в сравнительной таблице трех классов:

Как работает stringbuilder java

StringBuilder in Java represents a mutable sequence of characters. Since the String Class in Java creates an immutable sequence of characters, the StringBuilder class provides an alternative to String Class, as it creates a mutable sequence of characters. The function of StringBuilder is very much similar to the StringBuffer class, as both of them provide an alternative to String Class by making a mutable sequence of characters. However, the StringBuilder class differs from the StringBuffer class on the basis of synchronization. The StringBuilder class provides no guarantee of synchronization whereas the StringBuffer class does. Therefore this class is designed for use as a drop-in replacement for StringBuffer in places where the StringBuffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations. Instances of StringBuilder are not safe for use by multiple threads. If such synchronization is required then it is recommended that StringBuffer be used. String Builder is not thread-safe and high in performance compared to String buffer.

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

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