Действия со строками в 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
внутри означают, что нужно вывести ровно два знака после запятой.