— Привіт, Аміго!

— Адже вже віталися, Білаабо.

— Так? Але мені все одно приємно починати кожен урок із цієї фрази.

Сьогодні ми щільно займемося класом String.

— То я там уже все знаю. Навіть те, що String – immutable.

— У класу String 46 методів, скільки з них ти знаєш?

— Не більше десяти. Навіть, напевно, максимум 5 штук.

— Тоді слухай.

Розробники Java помітили, що здебільшого рядки всередині програм існують у незмінному вигляді, але іноді їх таки змінюють. Дуже неприємно, коли ви створили рядок, зберегли в нього щось важливе, передали в чужий метод, а він його змінив. Щоб такого не відбувалося, розробники вирішили створити два види рядків – змінний і незмінний.

— Клас String став відповідати за незмінний рядок, а клас StringBuilder – за змінний. Об'єкти цих класів легко перетворюються один на одного. У більшості випадків розробникам програм на Java досить просто String, що показує, що проектувальники Java мали рацію.

— Тобто. якщо мені потрібний рядок – я створюю клас String, а якщо потрібний рядок, що змінюється, то клас StringBuilder?

— Так. Насправді є ще клас StringBuffer – це копія StringBuilder, але всі методи якого оголошені synchronized, щоб до об'єкта можна було звертатися з різних ниток програми.

— А як такий приклад? Хіба тут рядок не змінюється?

String s = "cat";
s = s + "-" + s;

— Ні. Тут є два об'єкти String: "cat" і "cat-cat". Другий створюється з урахуванням першого, але об'єкт не змінюється. Насправді тут ще цікавіше. Ось який код згенерує компілятор, коли компілюватиме твій приклад:

String s = "cat";
StringBuilder s2 = новий StringBuilder(s);
s2.append("-");
s2.append(s);
s = s2.toString();

Тобто. Для створення нового рядка практично завжди використовується StringBuilder, просто іноді всю роботу за тебе робить компілятор. Але ж твій варіант простіший, хіба ні?

— Так, класно, що в Java такий сучасний компілятор.

— А тепер пройдемося за методами класу String:

1) Як дізнатися довжину рядка?

Метод length повертає довжину рядка – кількість символів.

Метод(и) Приклад(и)
int length();
String s = "Good news everyone!";
int n = s.length();
int n = "Good news everyone!".length();< /code>

2) Як отримати символ з рядка?

Метод charAt повертає символ рядка за його номером. Нумерація символів починається з 0.

Метод(и) Приклад(и)
char charAt(int index)
String s = "Good news everyone!";
char n = s.charAt(5);
char n = "Good news everyone!".charAt(5); 

3) Як отримати символи з рядка?

Метод toCharArray повертає масив усіх символів рядка.

Метод(и) Приклад(и)
char[] toCharArray()
String s = "Good news everyone!";
for(char c : s.toCharArray())
{
System.out.println(c);
}

4) Як порівняти рядки?

Метод equals перевіряє, чи збігаються рядки, а метод equalsIgnoreCase — чи збігаються рядки, ігноруючи регістр літер.

Метод(и) Приклад(и)
boolean equals(Object o)
String s = "cat";
boolean test1 = s.equals("cat");//true
boolean test2 = s.equals("Cat");//false
boolean test3 = s.equals("c"+"a"+"t");//true
boolean equalsIgnoreCase(String str)
String s = "cat";
boolean test1 = s.equalsIgnoreCase("cat");//true
boolean test2 = s.equalsIgnoreCase("Cat");//true
boolean test3 = s.equalsIgnoreCase("cAT");//true

5) Як перетворити всі літери на рядок у великі чи маленькі?

Метод toUpperCase повертає копію рядка, всі символи якого – великі.

Метод toLowerCase повертає копію рядка, всі символи якого є маленькими.

Метод(и) Приклад(и)
String toUpperCase()
String s = "Good news everyone!";
s = s.toUpperCase();
Результат:

s == "GOOD NEWS EVERYONE!";
String toLowerCase()
String s = "Good news everyone!";
s = s.toLowerCase();
Результат:

s == "good news everyone!";

6) Як забрати прогалини на початку та в кінці рядка?

Метод trim повертає копію рядка, без «порожніх» символів на початку та наприкінці.

Метод(и) Приклад(и)
String trim()
String s = "Good news everyone!";
s = s.trim();
Результат:

s == "Good news everyone!";