Строки

Базовый Java
≈ 4 мин чтения

Строка — это текст

Для текста в Java используется тип String. Строку можно записать прямо в коде между двойными кавычками и сохранить в переменную так же, как число или логическое значение.

String language = "Java";
String greeting = "Привет!";

System.out.println(language);
System.out.println(greeting);

String не относится к примитивным типам, но на базовом уровне работать с ним очень просто: создаём строку, передаём её в методы, соединяем с другими строками и вызываем у неё готовые операции.

Конкатенация строк

Строки можно соединять оператором +. Если рядом со строкой находится число, логическое значение или другой тип, Java преобразует его в текст и продолжит склеивание.

String name = "Анна";
int lessons = 8;

String message = "Ученик: " + name + ", уроков: " + lessons;
System.out.println(message);

Важно помнить, что выражение вычисляется слева направо. Пока строка ещё не встретилась, числа участвуют в обычных арифметических операциях.

System.out.println(2 + 3 + " Java"); // 5 Java
System.out.println("Java " + 2 + 3); // Java 23
Скобки делают намерение очевидным. Если внутри строки нужен результат вычисления, лучше написать "Сумма: " + (2 + 3), а не полагаться на порядок конкатенации.

Длина и символы

У строки есть метод length(), который возвращает её длину. Отдельный символ можно получить методом charAt(index). Как и в массивах, индексация начинается с нуля.

String word = "Java";

System.out.println(word.length());  // 4
System.out.println(word.charAt(0)); // J
System.out.println(word.charAt(3)); // a

Последний допустимый индекс всегда на единицу меньше длины строки. Например, для строки длиной 4 доступны индексы от 0 до 3.

Полезные операции со строками

Вместо ручной обработки каждого символа у String уже есть готовые методы. Для начала достаточно знать несколько часто встречающихся операций:

  • substring(from, to) — взять часть строки;
  • contains(text) — проверить, содержится ли фрагмент;
  • startsWith(prefix) и endsWith(suffix) — проверить начало или конец;
  • replace(oldText, newText) — заменить фрагменты;
  • isEmpty() — проверить, что длина равна нулю;
  • isBlank() — проверить, что строка пустая или состоит только из пробельных символов.
String path = "java/basics/strings";

System.out.println(path.substring(5, 11)); // basics
System.out.println(path.contains("strings")); // true
System.out.println(path.startsWith("java"));  // true
System.out.println(path.replace("/", " -> "));

У substring(from, to) начальный индекс включается, а конечный не включается. Такой же принцип границ уже встречался при работе с диапазонами индексов в массивах.

Строки неизменяемы

Одна из главных особенностей String: созданная строка не изменяет своё содержимое. Методы вроде replace() или substring() возвращают новую строку, а исходная остаётся прежней.

String text = "java";
String upper = text.toUpperCase();

System.out.println(text);  // java
System.out.println(upper); // JAVA

Поэтому вызов метода сам по себе не «переписывает» переменную. Если результат нужен дальше, его нужно сохранить или сразу использовать.

String status = "draft";
status.replace("draft", "ready");

System.out.println(status); // draft

status = status.replace("draft", "ready");
System.out.println(status); // ready

Как сравнивать строки

Для проверки содержимого строк используется метод equals(). Оператор == для строк отвечает на другой вопрос: ссылаются ли переменные на один и тот же объект. Поэтому для обычного сравнения текста на него полагаться нельзя.

String first = "Java";
String second = new String("Java");

System.out.println(first.equals(second)); // true
System.out.println(first == second);      // false
Для текста почти всегда нужен equals(). Даже если == в каком-то примере вернул true, это не делает его правильным способом сравнивать содержимое строк.

Специальные символы и многострочный текст

В обычном строковом литерале некоторые символы записываются через escape-последовательности. Например, \n создаёт перевод строки, \" — двойную кавычку, а \\ — обратный слеш.

String message = "Первая строка\nВторая строка";
String quote = "Он сказал: \"Java\"";

System.out.println(message);
System.out.println(quote);

Если текста много и он занимает несколько строк, удобнее использовать text block — литерал между тройными кавычками. Он позволяет сохранить многострочный текст без цепочки \n и большого количества экранирования.

String json = """
        {
          "language": "Java",
          "level": "basic"
        }
        """;

System.out.println(json);

В результате String остаётся тем же типом данных: меняется только удобство записи литерала. Для повседневного кода достаточно уверенно создавать строки, соединять их, читать отдельные символы, использовать готовые методы и сравнивать содержимое через equals().