Рядок () в java — це послідовність символів Юнікоду. Наприклад: "Абвгґд". В багатьох мовах програмування рядки зберігаються у масивах. Проте в java рядки представляють собою окремий об'єктний тип. Для рядків може використовуватись оператор "+", що здійснює конкатенацію(з'єднання) двох окремих рядків. Так в розглянутих навчальних прикладах конкатенація використовується при виводі на консоль System.out.println("Один" + "два" + "=" + "Три"). Для здійснення інших дій з рядками, як то пошук символів та буквосполучень, використовуються методи класу String.

Спецсимволи Оголошення змінної і присвоєння їй рядка відбувається наступним чином: String str = "Це рядок";

Для того щоб створити рядок, необхідно взяти літери в подвійні лапки: "це рядок". Також можна створити пустий рядок "". Якщо необхідно використати спецсимволи, то застосовують зворотню косу (backslash) "\". Наприклад, помістити в рядок внутрішні подвійні лапки можна таким чином "\" - це лапка". Аналогічно для одинарних лапок, недрукованих символів, тощо. Найчастіше коса застосовується для символу нового рядка: System.out.println("Це перший рядок тексту, \nа це другий текстовий рядок.");

Таким чином рядок (string) може містити текст з кількома текстовими рядками (в англ. застосовують термін multiline string — багатолінійний рядок, багаторядковий рядок або ж багаторядкова стрічка). Проте власне клас String не дуже підходить для зберігання великих об'ємів текстових даних та маніпуляцій з ними. Для цього краще застосовувати класи StringBuilder або ж StringBuffer.

Конкатенація Як вже було сказано конкатенація - це поєднання двох рядків, що здійснюється за допомогою оператора "+". Таким чином наступні рядки здійснюють одне й те саме: String str = "Це рядок"; String str = "Це"+" рядок";

При використанні конкатенації рядків з іншими типами даних відбувається автоматичне приведення до типу String. System.out.println(2 + "+" + 2 + "=" + "4 (чотири)"); String str3 = "цифра " + 5; //String + int дає String "цифра 5"

Також з'єднання двох рядків можна здійснити за допомогою методу concat(): String strEnd = "рулить"; String str = "Java ".concat(strEnd); //в результаті str="Java рулить"

Робота з рядками

В java об'єкти класу String не можна змінювати. На перший погляд — це додає проблем при роботі, але насправді це не так. Не можна змінювати сам рядок в пам'яті комп'ютера, але змінній, яка посилається на певний рядок, можна призначити інший рядок. String str = "Це"; String str2 = "рядок"; String str3 = "555"; str = str3; //так можна str = str + " " + str2; //і так можна Дію обмеження ви відчуєте, лише коли захочете, наприклад, замінити букву "е" на якусь іншу, або змінити її регістр. В інших мовах - це можна зробити без проблем. В java потрібно утворити новий рядок. Скопіювавши, наприклад, букву "Ц" і додавши до неї "Е". Рядок, на який вже не посилається жодна змінна, буде видалений з пам'яті комп'ютера автоматичним прибиральником сміття java.

В разі, якщо ж все ж таки необхідна маніпуляція з рядком напряму, то для таких цілей існують споріднені із String класи. Зокрема, StringBuffer — корисний, при роботі з великими об'ємами текстових даних, читання з файлу і т.п.

Щоб здійснити такі дії як пошук, заміна і т.п. в класі String існує чималий набір методів. Так, щоб дізнатися довжину рядка можна скористатися методом length(): String str = "Це рядок"; int strLength = str.length(); int str2Length = "Це рядок".length(); //можна і так Як бачимо виклик методів відбувається як при роботі із класами, з використанням оператору «.» (точка): «об'єкт.метод()» або «об'єктна_змінна.метод()».

Підрядки Для того, щоб одержати частину рядка (підрядок) з іншого більшого рядка можна скористатися методом substring(pos1, pos2) класу String.

Наприклад: String greeting = "Hello"; String s = greeting.substring(0,3); //скопіювати з greeting символи з 0 до 3, тобто 0, 1 та 2 – “Hel” В результаті було скопійовано перших три символи. Символи в рядку нумеруються починаючи з нуля. Можна розрахувати довжину отриманого рядка: pos2-pos1. В даному випадку 3-0=3;

Як вже згадувалось ми, не можемо змінювати рядки. Тому, якщо ми, наприклад, захочемо змінити рядок Hello на Help без застосування додаткової змінної, можна скористатися методом substring() та оператором конкатенації «+»: greeting = greeting.substring(0, 3) + "p!"; В результаті в greeting=“Help!”. Таким чином ми не змінюємо сам рядок, а присвоюємо змінній інший рядок.

Порівняння рядків Для того, щоб порівняти два рядки на рівність можна скористатися методом equals(): str1.equals(str2); Метод повертає true, якщо str1 та str2 рівні, інакше false. Можна також, замість змінних str1, str2 застосовувати рядкові константи. Наприклад: «Hello».equals(greeting); Згаданий метод порівнює рядки з врахування регістру символів. Для того, щоб не враховувався регістр при порівнянні існує метод equalsIgnoreCase(). "Hello".equalsIgnoreCase("hello"). Не використовуйте оператор ==, щоб перевірити рядки на рівність. Таким чином лише перевіряється, чи рядки розташовуються за одним місцем в пам'яті, крім того, результат може бути неоднозначним. Так, якщо ми String str1 = "Hello"; String str2 = "Hello"; if (str1 == str2) System.out.println("рівні"); else System.out.println("не рівні"); //скоріше всього на екрані отримаємо напис «рівні». Неоднозначність результату пов'язана з тим, що константні рядки в java можуть специфічним чином розподілятися (share) в пам'яті для спільного використання змінними. Хоча може бути, що існуватиме багато копій однакових рядків.

Зауважте, що це не відноситься до рядків, які створені в результаті операцій «+» чи substring: String str1 = "Hello"; String str2 = str1.substring(0,3) + "lo"; if (str1 == str2) System.out.println("рівні"); else System.out.println("не рівні"); //скоріше всього на екрані отримаємо напис «не рівні».

Приведення до типу Часто постає необхідність явного приведення типу String до інших типів і навпаки. Наприклад, ви вводите з клавіатури певне число, воно буде у вигляді рядка символів, а для проведення обчислень його потрібно привести або до типу int, якщо це цілочисельне число, або ж до float чи double, якщо дробове. Для таких випадків слугує ряд статичних методів valueOf(), які наявні в класі String, а також в класах, які реалізовують числові типи Float, Double та ін.

Наступна програма вимагає введення числа з клавіатури і виводить результат перемноження введеного числа та 36: import java.util.Scanner;

public class TestValueOf {

public static void main(String[] args) { int intNumber = 36;

System.out.print("Введіть число: "); //зчитуємо число з клавіатури Scanner in = new Scanner(System.in); String doubleStr = in.next(); System.out.println("Ви ввели: " + doubleStr); //Ціла і дробова частина повинна бути через крапку //шукаємо чи не ввели через кому int index = doubleStr.indexOf(",");

if (index >= 0) { System.out.println("Кома у позиції: " + index); doubleStr = doubleStr.replace(',', '.'); //замінити кому на крапку

//Перетворюємо int число у рядок тексту String strNumber = String.valueOf(intNumber);

//Приєднуємо число до рядка через метод concat (хоча можна і оператором "+") String strOut = "*".concat(strNumber) + "=";

//Перетворюємо введений рядок тексту у число double number = Double.valueOf(doubleStr); number = number * intNumber; //множимо введене число на 36

System.out.println(doubleStr + strOut + number);

Результат виконання: Введіть число: 555,5 Ви ввели: 555,5 Кома у позиції: 3 555.5*36=19998.0

У наведеному прикладі для знаходження коми використано метод int indexOf(String str), а для заміни коми на крапку метод String replace(char oldChar, char newChar). Якщо не зробити таку заміну, то при приведенні типу String до Double виникне помилка виконання і програма завершиться аварійно.

За бажаннями, Ви можете ускладнити програму додавши перевірку на наявність непотрібних символів у введеному рядку і відкидання їх. Для вирішення цієї задачі скористайтесь списком методів, що наведений нижче в пункті розділу під назвою "String API".

Кодові точки та кодові одиниці

В мові Java рядки організовані як послідовність значень типу char. Значення char представляються в Unicode 16 і являють собою кодову одиницю (Code Units). Найбільш часто використовувані символи Unicode представляються однією кодовою одиницею і також являють собою кодові точки(Code Points). Проте специфічні рідковживані символи представляються двома кодовими одиницями. Ці дві кодові одиниці не будуть являти собою дві кодові точки, вони утворюють одну кодову точку. Якщо в рядку є такі символи то метод length() повертатиме неправильну символьну довжину, по суті він повертатиме кількість кодових одиниць, а не кількість справжніх символів(кодових точок).

Тому, якщо такі символи можливі в рядках, то необхідно використовувати методи для роботи з кодовими точками. Наприклад, щоб визначити справжню кількість символів, потрібно визначити кількість кодових точок в рядку методом codePointCount:

int cpCount = greeting.codePointCount(0, greeting.length()); Також існують методи для отримання кодової точки з рядка, перевірки чи значення char отримане з рядка не є складовою кодової точки.

String API

Клас String в Java містить понад 50 методів, які можуть бути корисні при програмуванні. Нижче наведено список з найбільш корисних методів. Детальніше про методи дивіться у документації по String.