Java: Кавычки

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

С точки зрения Java строка представляет собой набор символов, заключенный в двойные кавычки. Посмотрим на примеры.

"Hello"
"Goodbye"
"G"
" "
""

Все эти варианты — строки.

  • "Hello" и "Goodbye" — строки из нескольких символов
  • "G" — строка из одного символа
  • " " — строка из одного пробела
  • "" — пустая строка, в ней нет ни одного символа. Играет такую же роль, как 0 в математике

Все, что находится внутри кавычек, считается строкой, даже если там только пробел или вообще ничего нет.

Если вывести строки на экран, то "Hello" и "Goodbye" будут хорошо заметны. А вот " " и "" сбивают с толку. Вывод пустой строки выглядит как полное отсутствие текста, а строка с пробелом покажет "пустое место", которое визуально трудно отличить от пустоты. Java четко различает эти случаи. Пустая строка означает отсутствие символов, а строка с пробелом содержит конкретный символ пробела.

Контрольный вопрос. Это одинаковые строки или нет?

"хекслет"
" хекслет"

Терминология. Строка или строчка?

В программировании есть терминологическая ловушка.

  • Строка (string) — это тип данных, тот самый набор символов в кавычках, например "hello"
  • Строчка (line) — это строка текста в файле или в коде

Например, в коде ниже есть строчка, но нет строки.

System.out.println(5);

Чтобы не путаться, в этом курсе мы будем придерживаться таких формулировок.

  • Строка, когда говорим о типе данных
  • Строчка, когда говорим о строках кода

Только двойные кавычки

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

System.out.println("Hello");

Одинарные кавычки в Java тоже встречаются, но это совсем другая история. Запись вида 'A' обозначает один символ, а не строку. Поэтому, когда речь идет о тексте, мы используем только двойные кавычки.

Проблема с кавычками внутри строки

Представьте, что вы хотите напечатать фразу Dragon's mother. В ней есть апостроф ('s), который совпадает с символом одинарной кавычки. Поскольку строка ограничена двойными кавычками, апостроф внутри нее не мешает.

System.out.println("Dragon's mother");
// => Dragon's mother

Java понимает, что одинарная кавычка внутри строки — это обычный символ. Строка начинается и заканчивается двойными кавычками, а все, что между ними, считается ее содержимым.

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

Dragon's mother said "No"

Если вставить двойные кавычки прямо внутрь строки, программа не скомпилируется.

// Завершится с синтаксической ошибкой
System.out.println("Dragon's mother said "No"");

С точки зрения Java здесь получилась странная конструкция из трех частей.

  • Строка "Dragon's mother said "
  • Слово No, которое не взято в кавычки и потому не считается строкой
  • Пустая строка ""

Java решит, что первая строка заканчивается перед словом No, а дальше идет непонятный код. Это и вызовет ошибку.

Символ экранирования

Чтобы поместить двойную кавычку внутрь строки, ее экранируют с помощью обратного слэша \. Он говорит компилятору, что следующий за ним символ — часть строки, а не граница строки.

System.out.println("Dragon's mother said \"No\"");
// => Dragon's mother said "No"

Здесь мы экранируем двойные кавычки внутри строки, заключенной в двойные кавычки. Java воспринимает \" как один символ-кавычку, а не как два отдельных символа. Такие записи называют управляющими последовательностями.

Чтобы вывести сам обратный слэш, его тоже экранируют вторым слэшем.

System.out.println("\\");
// => \

Задание

Напишите программу, которая выведет на экран:

"Khal Drogo's favorite word is "athjahakar""

Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы.

Полезное

Команда проекта находится в телеграм-сообществе. Там можно задать любой вопрос и повлиять на проект

Нашли ошибку? Есть что добавить? Пулреквесты приветствуются