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

— Так ведь уже здоровались, Билаабо.

— Да? Но мне все равно приятно начинать каждый урок с этой фразы.

Сегодня мы плотно займемся классом 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 = new 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();

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!";