StringBuffer та StringBuilder. Регулярні вирази

Прокрутити вниз

StringBuffer та StringBuilder. Регулярні вирази – онлайн курс java

1. StringBuffer та StringBuilder

Класи StringBuffer і StringBuilder використовуються для роботи з рядками, які часто змінюються. Це альтернатива класу `String`, але на відміну від `String`, ці класи представляють змінювані рядки.

Проблема з `String`:

Рядки у Java є незмінними (immutable), тому кожен раз, коли ви модифікуєте рядок, створюється новий об’єкт, що може негативно впливати на продуктивність, особливо при частих змінах.

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

Основні відмінності між `StringBuffer` і `StringBuilder`:

  • StringBuffer: синхронізований (thread-safe). Використовується в багатопотоковому середовищі, де потрібно уникати одночасних змін з різних потоків.
  • StringBuilder: не синхронізований. Підходить для однопотокового середовища, коли не потрібно синхронізації. Швидший, ніж `StringBuffer`.

Операції з `StringBuffer` та `StringBuilder`

Операції цих класів аналогічні, тому приклади будуть актуальні для обох класів.

Створення об’єктів:

StringBuffer sb1 = new StringBuffer(“Hello”);
StringBuilder sb2 = new StringBuilder(“Hello”);

Основні методи:

1. Додавання рядків (конкатенація):
Метод append() додає новий рядок в кінець існуючого.
sb1.append(” World”); // “Hello World”

2. Вставка (insertion):
Метод insert(int offset, String str) вставляє рядок на певну позицію.
sb1.insert(6, “Java “); // “Hello Java World”

3. Заміна підрядка:
Метод replace(int start, int end, String str) замінює частину рядка між позиціями `start` і `end` на новий рядок.
sb1.replace(6, 10, “C++”); // “Hello C++ World”

4. Видалення символів:
Метод delete(int start, int end) видаляє символи між індексами `start` і `end`.
sb1.delete(5, 9); // “Hello World”

5. Зворотний порядок символів:
Метод reverse() змінює порядок символів у рядку на зворотний.
sb1.reverse(); // “dlroW olleH”

6. Отримання довжини та ємності:
length() повертає кількість символів у рядку.
capacity() повертає ємність (розмір виділеної пам’яті для рядка).
int length = sb1.length(); // 11
int capacity = sb1.capacity(); // Залежить від розміру

7. Перетворення у рядок:
Метод toString() перетворює об’єкт `StringBuffer` або `StringBuilder` у рядок (`String`).
String str = sb1.toString();

Приклад роботи з `StringBuilder`:

public class StringBuilderExample {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(“Hello”);

// Додавання
sb.append(” World”); // “Hello World”

// Вставка
sb.insert(6, “Java “); // “Hello Java World”

// Заміна
sb.replace(6, 10, “C++”); // “Hello C++ World”

// Видалення
sb.delete(5, 9); // “Hello World”

// Зворотній порядок
sb.reverse(); // “dlroW olleH”

// Перетворення у рядок
String result = sb.toString();

System.out.println(result); // “dlroW olleH”
}
}

2. Регулярні вирази (Regular Expressions)

Регулярні вирази (regex) — це спеціальні шаблони, що дозволяють здійснювати пошук, відповідність та маніпуляції з текстовими даними на основі шаблону. У Java регулярні вирази реалізовані через клас Pattern та Matcher з пакету `java.util.regex`.

Основні класи для роботи з регулярними виразами:

1. Pattern — представляє сам регулярний вираз.
2. Matcher — використовується для пошуку та перевірки відповідності рядків регулярному виразу.

Основні операції з регулярними виразами:

1. Перевірка відповідності рядка регулярному виразу:
Метод matches() класу `String` дозволяє швидко перевірити, чи відповідає рядок регулярному виразу.
String str = “abc123”;
boolean matches = str.matches(“[a-z]+\\d+”); // true

2. Шаблон та пошук:
За допомогою класів `Pattern` та `Matcher` можна створювати складніші операції пошуку.
String text = “I love Java and programming.”;
Pattern pattern = Pattern.compile(“\\bJava\\b”); // Шукаємо слово “Java”
Matcher matcher = pattern.matcher(text);
boolean found = matcher.find(); // true

3. Заміна тексту за шаблоном:
Метод replaceAll() дозволяє замінювати частини тексту, які відповідають регулярному виразу.
String text = “I love Java and JavaScript.”;
String replaced = text.replaceAll(“\\bJava\\b”, “C++”); // “I love C++ and JavaScript.”

4. Розбиття рядка за шаблоном:
Метод split() класу `String` розбиває рядок на частини за регулярним виразом.
String text = “apple, banana, orange”;
String[] fruits = text.split(“, “); // Масив [“apple”, “banana”, “orange”]

Приклад використання регулярних виразів:

import java.util.regex.*;

public class RegexExample {
public static void main(String[] args) {
String text = “I love Java and JavaScript.”;

// Шаблон для пошуку слова “Java”
Pattern pattern = Pattern.compile(“\\bJava\\b”);
Matcher matcher = pattern.matcher(text);

// Перевірка наявності слова “Java”
while (matcher.find()) {
System.out.println(“Знайдено: ” + matcher.group() + ” на позиції ” + matcher.start());
}

// Заміна “Java” на “C++”
String newText = text.replaceAll(“\\bJava\\b”, “C++”);
System.out.println(“Після заміни: ” + newText);
}
}

Основні символи регулярних виразів:

1. `[]` — діапазон символів.
– `[a-z]` — будь-яка літера від `a` до `z`.
– `[0-9]` — будь-яка цифра.

2. `^` — початок рядка.
– `^abc` — рядок має починатися з `abc`.

3. `$` — кінець рядка.
– `abc$` — рядок має закінчуватися на `abc`.

4. `.` — будь-який символ.
– `a.b` — “a” + будь-який символ + “b” (наприклад, “a1b” або “acb”).

5. `*` — 0 або більше входжень.
– `a*` — нуль або більше літер “a”.

6. `+` — 1 або більше входжень.
– `a+` — одна або більше літер “a”.

7. `?` — 0 або 1 входження.
– `a?` — одна літера “a” або її відсутність.

Висновок:

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

StringBuffer та StringBuilder Регулярні вирази