Действия со строками в Java

Конкатенация и преобразование в строку

Оператор + конкатенирует, т.е. соединяет строки: "abc" + "xyz" вычисляется в "abcxyz".

Строки можно складывать не только со строками: если у оператора + один из аргументов строка, а другой - нет, то он автоматически преобразуется в строку:

"abc" + 2 // = "abc2"
2 + "abc" // = "2abc"
"abc" + 2 + 3 // = "abc23"
"abc" + (2 + 3) // = "abc5"

Старайтесь не полагаться на автоматическое преобразование объектов в строку. Используйте такое преобразование только в простых программах или для отладочных целей. Лучше преобразовывать объекты явно, при этом вы можете указать, как именно вы хотите преобразовать. Отличный пример сказанного - это преобразование массивов в строки. Неявное преобразование делает совсем не то, что вы ожидаете:

int[] a = new int[10];
System.out.println("Массив a = " + a);

распечатает Массив a = [I@2a139a55 или что-то похожее.

Чтобы превратить массив в строку, пользуйтесь методом Arrays.toString(ваш массив). Этот метод выписывает элементы массива в квадратных скобках через запятую. Чтобы можно было вызвать этот метод, нужно в самом начале программы написать import java.util.Arrays.

Сравнение строк

Строки можно сравнивать с помощью обычного оператора сравнения, но при этом результат может оказаться неверным. Поэтому никогда не сравнивайте строки таким образом:

"abc" == "abc" //скорее всего получится true
"abc" == "abcd".substring(0, 3) /скорее всего будет false, хотя
"abcd".substring(0, 3) //это тоже "abc".

На самом деле, в этом случае вы сравниваете сами объекты со строками, а не их содержимое, это эквиваленто оператору is в Python. А правильно сравнивать строки только через метод equals.

String s = "abc";
s.equals("abc")
"abc".equals(s)
Objects.equals(s, "abc")

Выбирайте из этих вариантов тот, который больше нравится. У первого варианта есть недостаток, что он может не работать, если s == null (см. лекции про null).

Некоторые методы класса String

Список всех методов можно найти по ссылке https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html.

// символ по индексу
"abcdef".charAt(2) // получается 'c'
// проверить, начинается ли, кончается ли на заданную строку
"abcdef".startsWith("abc") // true
"abcdef".endsWith("def") //true
// вырезать подстроку
"abcdef".substring(2, 5) // "cde": со второго по пятый индекс, не включительно
"abcdef".substring(2) // "cdef": со второго индекса до конца
// удалить пробельные символы с обеих сторон, или в начале, или в конце
"   xyz    ".strip() // "xyz"
"   xyz    ".stripLeading() // "xyz    " 
"   xyz    ".stripTrailing() // "   xyz"
//разбить по указанному символу. На самом деле, нужно указывать регулярное выражение. См. позже.
"one two three".split(" ") // массив из слов "one", "two", "three"

Форматированный вывод

Метод format класса String позволяет делать форматированный вывод, это аналог метода format в Python. В документации метод обозначен словом static, это значит, что его надо вызывать через класс, т.е. вот так:

String.format("У %s было %d яблок и %.2f груш.", "Васи", 5, 2.5)

Получится "У Васи было 5 яблок и 2.50 груш.". Вместо %s подставляется строковое значение, вместо %d числовое в десятичной системе счисления, и вместо %f - вещественное число. Дополнительные символы .2 внутри означают, что нужно вывести ровно два знака после запятой.