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 кращий для однопотокових програм через вищу продуктивність.
- Регулярні вирази є потужним інструментом для пошуку та маніпулювання текстом за шаблонами, особливо корисними для обробки строкових даних, таких як перевірка форматів, пошук підрядків або заміна.