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