Назад Зміст Вперед

Класи StringBuilder і StringBuffer Java

Класи StringBuilder і StringBuffer є "близнюками" і за своїм призн
аченням близькі до класу String, але, на відміну від останнього, вміст і розміри об'єктів класів StringBuilder і StringBuffer можна змінювати.

Класи StringBuffer і StringBuilder в Java використовуються, коли виникає необхідність зробити багато змін в рядку символів.

На відміну від рядків, об'єкти типу StringBuffer і StringBuilder можуть бути змінені знову і знову, залишаючи після себе безліч нових невикористовуваних об'єктів.

В Java StringBuilder був введений починаючи з Java 5. Основна відмінність між StringBuffer і StringBuilder є те, що методи StringBuilder не є безпечними для потоків (несинхронізовані).

Рекомендується використовувати StringBuilder щоразу, коли це можливо, тому що він швидше, ніж StringBuffer в Java. Однак, якщо необхідна безпека потоків, найкращим варіантом є об'єкти StringBuffer.

За допомогою відповідних методів і конструкторів об'єкти класів StringBuffer, StringBuilder і String можна перетворювати один в одного. Конструктор класу StringBuffer (також як і StringBuilder) може брати участь у ролі параметра об'єкт String або ненегативний розмір буфера. Об'єкти цього класу можна перетворити в об'єкт класу String методом toString () або за допомогою конструктора класу String.
приклад
public class Test {

   public static void main(String args[]){
       StringBuffer sBuffer = new StringBuffer("тест");
       sBuffer.append(" StringBuffer");
       System.out.println(sBuffer);  
   }
}
Отримаємо наступний результат:
тест StringBuffer

методи StringBuffer

Список методів, підтримуваних класом StringBuffer:
Методи з описом
1public StringBuffer append (String s)
Обновляє значення об'єкта, який викликає метод. Цей метод приймає boolean, char, int, long, Strings і т.д.
2public StringBuffer reverse ()
Цей метод змінює значення об'єкта StringBuffer, який викликає метод.
3public delete (int start, int end)
Видаляє рядок, починаючи з початкового індексу до кінцевого індексу.
4public insert (int offset, int i)
Цей метод вставляє рядок s в позицію згадану по зсуву.
5replace (int start, int end, String str)
Цей метод замінює символи в підрядку даного StringBuffer символами в зазначеному рядку.
Список інших методів (за винятком методів set), які дуже схожі на методи класу рядків:
Методи з описом
1int capacity () 
Повертає поточну місткість буфера String.
2char charAt (int index) 
Повертається вказаний символ послідовності, в даний час представлений буфером рядки, зазначений індексом аргумент.
3void ensureCapacity (int minimumCapacity) 
Гарантує місткість буфера, принаймні рівним зазначеному мінімуму.
4void getChars (int srcBegin, int srcEnd, char [] dst, int dstBegin) 
Символи копіюються з цього буфера рядка в символьний масив призначення dst.
5int indexOf (String str) 
Повертає індекс в цьому рядку першого входження зазначеної підрядка.
6int indexOf (String str, int fromIndex) 
Повертає індекс в цьому рядку першого входження зазначеної підрядка, починаючи з зазначеного індексу.
7int lastIndexOf (String str) 
Повертає індекс в цьому рядку останнього входження зазначеної підрядка.
8int lastIndexOf (String str, int fromIndex) 
Повертає індекс в цьому рядку останнього входження зазначеної підрядка, починаючи з зазначеного індексу.
9int length () 
Повертає довжину строкового буфера (кількість символів).
10void setCharAt (int index, char ch) 
Символ із зазначеним індексом цього буфера рядка має значення ch.
11void setLength (int newLength) 
Встановлює довжину буфера рядка (Stringbuffer).
12CharSequence subSequence (int start, int end) 
Повертає нову послідовність символів, яка є підпослідовність цієї послідовності.
13String substring (int start) 
Повертає новий рядок, яка містить підпослідовність символів в даний момент містяться в StringBuffer. Підрядок починається з вказаного індексу і триває до кінця StringBuffer.
14String substring (int start, int end) 
Повертає новий рядок, яка містить підпослідовність символів в даний момент містяться в цьому StringBuffer.
15String toString () 
Перетворення в рядок, що представляє дані в цьому рядку буфера.

Слід звернути увагу на наступні методи:

void setLength (int n) - щоб вибрати розмір буфера;
void ensureCapacity (int minimum) - установка гарантованого мінімального розміру буфера;
int capacity () - повернення поточного розміру буфера;
StringBuffer append (параметри) - додавання до вмісту об'єкта строкового уявлення аргументу, який може бути символом, значенням базового типу, масивом і рядком;
StringBuffer insert (параметри) - вставка символу, об'єкта чи рядка в зазначену позицію;
StringBuffer deleteCharAt (int index) - видалення символу;
StringBuffer delete (int start, int end) - видалення підрядка;
StringBuffer reverse () - звернення вмісту об'єкта.

У класі присутні також методи, аналогічні методам класу String, такі як replace (), substring (), charAt (), length (), getChars (), indexOf () і ін.

/ * Приклад # 6: властивості об'єкта StringBuffer: DemoStringBuffer.java * /
package chapt07;
public class DemoStringBuffer {
public static void main (String [] args) {
StringBuffer sb = new StringBuffer ();
System.out.println ( "довжина ->" + sb.length ());
System.out.println ( "розмір ->" + sb.capacity ());
// Sb = "Java"; // Помилка, тільки для класу String
sb.append ( "Java");
System.out.println ( "рядок ->" + sb);
System.out.println ( "довжина ->" + sb.length ());
System.out.println ( "розмір ->" + sb.capacity ());
System.out.println ( "реверс ->" + sb.reverse ());
}
}


Результатом виконання даного коду буде:
довжина -> 0
розмір -> 16
рядок -> Java
довжина -> 4
розмір -> 16
реверс -> avaJ


При створенні об'єкта StringBuffer конструктор за замовчуванням автоматично резервує певний об'єм пам'яті (16 символів), що в подальшому дозволяє швидко змінювати вміст об'єкта, залишаючись в межах ділянки пам'яті, виділеної під об'єкт. Розмір резервованій пам'яті при необхідності можна вказувати в конструкторі. Якщо довжина рядка StringBuffer після зміни перевищує його розмір, то ємність об'єкта автоматично збільшується, залишаючи при цьому резерв для подальших змін. За допомогою методу reverse () можна швидко змінити порядок символів в об'єкті.

Якщо метод, що викликається об'єктом StringBuffer, виробляє зміни в його вмісті, то це не призводить до створення нового об'єкта, як
в разі об'єкта String, а змінює поточний об'єкт StringBuffer.

/ * Приклад # 7: зміна об'єкта StringBuffer: RefStringBuffer.java * /
package chapt07;
public class RefStringBuffer {
public static void changeStr (StringBuffer s) {
s.append ( "Microsystems");
}
public static void main (String [] args) {
StringBuffer str = new StringBuffer ( "Sun");
changeStr (str);
System.out.println (str);
}
}


В результаті виконання цього коду буде виведений рядок:
Sun Microsystems
Для класу StringBuffer НЕ перевизначені методи equals () і
hashCode (), тобто порівняти вміст двох об'єктів неможливо, до того ж хеш-коди всіх об'єктів цього типу обчислюються так само, як і для класу
Object.

/ * Приклад # 8: порівняння об'єктів StringBuffer і їх хеш-кодів:
EqualsStringBuffer.java * /

package chapt07;
public class EqualsStringBuffer {
public static void main (String [] args) {
StringBuffer sb1 = new StringBuffer ( "Sun");
StringBuffer sb2 = new StringBuffer ( "Sun");
System.out.print (sb1.equals (sb2));
System.out.print (sb1.hashCode () ==
sb2.hashCode ());
}
}

Результатом виконання даної програми буде двічі виведене значення false.
.