Сьогодні ми розглянемо, що таке java string, а також яку роль тут відіграє рядок (якщо ви ще на початковому рівні, радимо звернути увагу на курси Java Start і Java Spring на платформі FoxmindED).
У Java, рядок являє собою колекцію символів у подвійних лапках, наприклад, “Hello, world!”. Він є одним з основних типів даних і використовується для зберігання та обробки текстової інформації. Еволюція від роботи з рядками в мові C зробила їх об’єктами, що забезпечує зручність і безпеку обробки тексту. Рядки в Java відіграють ключову роль у додатках, від опрацювання користувацького введення до роботи з базами даних, забезпечуючи обмін і подання інформації. Незмінність рядків у Java робить їх використання передбачуваним і безпечним, особливо в контексті створення надійних і масштабованих додатків.
Створення та ініціалізація рядків
Рядки в Java створюються за допомогою одного з таких способів:
- Використання літералів (спосіб є найпростішим і використовується найчастіше – рядок створюється із зазначеним значенням):
String str = "Hello, world!";
- Використання конструкторів (створення рядка дає змогу задати початковий індекс і довжину рядка. Однак при роботі з літералами такий спосіб зазвичай надлишковий):
String str = new String("Hello, world!");
- Перетворення з інших типів даних (тут приклад з використанням методу valueOf()):
boolean bool = true;
String str4 = String.valueOf(bool);
System.out.println(str4); // Conclusion: true
Рядки в Java можуть бути ініціалізовані так:
- При присвоєнні значення:
String str = "Hello, world!";
- При оголошенні змінної (значення рядка буде присвоєно змінній при її оголошенні):
String greeting = "Hello, world!";
System.out.println(greeting); // Conclusion: Hello, world!
- При використанні оператора new (рядок створюється із зазначеним значенням, а потім присвоєно змінній):
String customGreeting = new String("Custom Hello, world!");
System.out.println(customGreeting); // Вивід: Custom Hello, world!
Розглянемо приклади ініціалізації рядків:
- Створення рядка з використанням конкатенації літералів
String fullName = "John" + " " + "Doe";
- Створення рядка з масиву символів
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String fromCharArray = new String(charArray);
Основні операції
Рядки в Java забезпечують безліч методів для зручної роботи з текстовою інформацією. Серед найважливіших операцій можна виділити:
- Отримання довжини рядка (для цього використовується метод length():
String str = "Hello, World!";
int length = str.length();
System.out.println("String length: " + length);
- Отримання індексу символу (рядки в Java індексуються з 0, що означає, що перший символ має індекс 0, другий – 1 і так далі. Для доступу до символів рядка використовується метод charAt(index):
String str = "Java";
char firstChar = str.charAt(0); // Getting the first character (J)
char secondChar = str.charAt(1); // Getting the second character (a)
Розглянемо методи для роботи з рядками:
- Метод substring(startIndex, endIndex) використовується для вилучення підрядка з рядка. Тут startIndex – це індекс початку підрядка, а endIndex – індекс символу, наступного за кінцем підрядка.
String str = "Programming";
String subStr = str.substring(3, 7); // Getting a substring "gram"
- Метод concat(String str) використовується для об’єднання двох рядків. Він повертає новий рядок, що являє собою конкатенацію вихідного рядка і того, який передано як аргумент.
String str1 = "Hello";
String str2 = "World";
String result = str1.concat(", ").concat(str2); // Result: "Hello, World"
- Інші методи
- toUpperCase() і toLowerCase(): переведення рядка у верхній або нижній регістр.
- trim(): видалення пробілів на початку та наприкінці рядка.
- replace(oldChar, newChar) і replaceAll(regex, replacement): заміна символів або підрядка.
- startsWith(prefix) і endsWith(suffix): перевірка початку і кінця рядка.
Незмінність рядків
Ключовою концепцією під час роботи з рядками в Java є їхня незмінність. Це означає, що після створення рядка його вміст не можна змінити. Коли рядок створюється, він отримує властивість бути постійним, і будь-яка зміна його вмісту створює новий рядок. Ця властивість застосовується до всіх методів, які здавалося б могли б змінити вміст рядка, таких як конкатенація, заміна символів та інші.
Цей принцип незмінності є фундаментальним для класу String і впливає на безліч аспектів роботи з текстовими даними.
String original = "Hello";
String modified = original.concat(", World!"); // A new line is created
У наведеному прикладі original залишається незмінним, і результат конкатенації зберігається в новому рядку modified. Це робиться для забезпечення безпеки та передбачуваності роботи з рядками.
Наведемо приклади та наслідки незмінності рядків:
- Оскільки рядки незмінні, вони можуть безпечно використовуватися в багатопотокових середовищах. Не потрібно турбуватися про те, що інший потік змінить вміст рядка в непередбачений момент.
- Оскільки рядки незмінні, вони можуть бути закешовані. Це означає, що різні змінні можуть посилатися на один і той самий рядок, що покращує ефективність використання пам’яті.
- Багато операцій можуть спільно використовувати наявні рядки. Це знижує кількість створюваних об’єктів, що, своєю чергою, знижує навантаження на збирача сміття.
Порівняння рядків
Порівняння рядків у Java – це важливий аспект роботи з текстовими даними, і мова надає кілька методів для цього. Три основні методи порівняння рядків – equals(), equalsIgnoreCase() і compareTo().
- Метод equals() використовується для перевірки еквівалентності двох рядків. Він порівнює вміст рядків, враховуючи кожен символ і регістр.
String str1 = "Hello";
String str2 = "Hello";
boolean result = str1.equals(str2); // true, since the contents are identical
- Метод equalsIgnoreCase() виконує порівняння рядків, ігноруючи регістр символів. Таким чином, рядки “Hello” і “hello” вважатимуться еквівалентними.
String str1 = "Hello";
String str2 = "hello";
boolean result = str1.equalsIgnoreCase(str2); // true, case ignored
- Метод compareTo() використовується для порівняння рядків лексикографічно (за алфавітом). Він повертає від’ємне число, якщо рядок, що викликає, менший за той, що передано в аргументі; позитивне число, якщо більший; і нуль, якщо рядки рівні.
String str1 = "apple";
String str2 = "banana";
int result = str1.compareTo(str2); // Negative number because "apple" comes before "banana"
Наведемо приклади правильного і неправильного порівняння рядків…
- Правильне:
String str1 = "Java";
String str2 = "Java";
if (str1.equals(str2)) {
System.out.println("The lines are identical.");
}
- Неправильне:
String str1 = "Java";
String str2 = "java";
if (str1.equals(str2)) {
System.out.println("The lines are identical."); // This block of code will not execute due to a case difference
}
Правильне порівняння враховує регістр, а неправильне може призвести до невірних результатів. Тому важливо вибирати відповідний метод порівняння залежно від вимог вашої програми.
Конкатенація
Конкатенація рядків у Java означає об’єднання двох або більше рядків для створення нового. Це часто використовується при формуванні виводу, створенні повідомлень або комбінуванні текстових даних. У Java існує кілька способів виконання конкатенації, включно з використанням оператора + і методу concat().
- Оператор +: з’єднує два рядки, створюючи новий з їхніми значеннями.
String str1 = "Hello, ";
String str2 = "world!";
String concatenatedString = str1 + str2;
Цей код створить новий рядок зі значенням “Hello, world!”.
- Метод concat(): поєднує два рядки, повертаючи новий рядок.
String str3 = "Hello, ";
String str4 = "world!";
String concatenatedUsingConcat = str3.concat(str4);
Новий рядок зі значенням “Hello, world!”
Робота з підрядками
У Java для роботи з підрядками використовуються такі методи:
- substring(): повертає підрядок рядка, що починається із зазначеного індексу і закінчується індексом, який менший або дорівнює зазначеному.
String str = "Hello, world!";
String substring = str.substring(0, 5);
- split(): повертає масив підрядків, розділених зазначеним роздільником.
String str = "Hello, world!";
String[] substrings = str.split(" ");
- replace(): замінює всі входження зазначеного символу або підрядка в рядку на інший символ або підрядок.
String str = "Hello, world!";
String replaced = str.replace("Hello", "Goodbye");
Приклади вилучення та заміни підрядків у рядку
- Витяг підрядка
String str = "Hello, world!";
String substring = str.substring(0, 5);
System.out.println(substring); // Hello
- Заміна підрядка
String str = "Hello, world!";
String replaced = str.replace("Hello", "Goodbye");
System.out.println(replaced); // Goodbye, world!
Рядки та масиви
Перетворення рядка в масив символів можна виконати з використанням методу toCharArray() класу String. Цей метод повертає новий масив символів, що представляє вміст рядка.
String text = "Hello, World!";
char[] charArray = text.toCharArray();
// charArray = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!']
Також перетворення масиву символів у рядок може бути виконано з використанням конструктора класу String, що приймає масив символів як аргумент.
char[] charArray = {'H', 'e', 'l', 'l', 'o'};
String text = new String(charArray);
// text = "Hello"
Наведемо приклад практичного використання
Підрахунок голосних букв у рядку:
public class VowelCounter {
public static void main(String[] args) {
String sentence = "Programming is fun";
char[] charArray = sentence.toCharArray();
int vowelCount = 0;
for (char c : charArray) {
if (isVowel(c)) {
vowelCount++;
}
}
System.out.println("Number of vowels: " + vowelCount);
}
private static boolean isVowel(char c) {
return "AEIOUaeiou".indexOf(c) != -1;
}
}
У цьому прикладі рядок “Programming is fun” перетворюється на масив символів, і потім за допомогою методу isVowel() підраховується кількість голосних букв у рядку.
StringBuilder й StringBuffer
У Java існують два класи для роботи з рядками: StringBuilder і StringBuffer. Обидва вони надають методи для роботи з рядками, але між ними є деякі важливі відмінності.
Критерій | StringBuilder | StringBuffer |
Потокобезпека | Не синхронізований | Синхронізований |
Продуктивність | Більш продуктивний | Може бути менш ефективним |
Використання в потоках | Не рекомендується | Рекомендується в багатопотоках |
Мутабельність | Так | Так |
StringBuilder ефективніший в однопотокових сценаріях, оскільки не забезпечує синхронізацію, тоді як StringBuffer забезпечує безпеку в багатопотокових умовах завдяки синхронізації. Якщо потрібна зміна рядка, додавання або видалення символів, а також перетворення в інший формат, рекомендується використовувати перший. У разі необхідності роботи зі змінюваним рядком у багатопотоковому середовищі, краще скористатися другим.
Висновок
У цій статті ми розглянули основи роботи з рядками в Java. Розуміння цих концепцій є ключовим для розробників, оскільки рядки відіграють важливу роль в обробці текстових даних. Рекомендується додатково вивчити документацію Java і провести практичні вправи для поглибленого розуміння роботи з рядками.
Ти вже навчився використовувати рядки в Java? Якщо є питання, запитуй у коментарях нижче!