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 motherJava понимает, что одинарная кавычка внутри строки — это обычный символ. Строка начинается и заканчивается двойными кавычками, а все, что между ними, считается ее содержимым.
Сложности начинаются, когда внутри строки нужны сами двойные кавычки. Представьте, что мы хотим вывести такой текст:
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""Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы.
Полезное
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 motherJava понимает, что одинарная кавычка внутри строки — это обычный символ. Строка начинается и заканчивается двойными кавычками, а все, что между ними, считается ее содержимым.
Сложности начинаются, когда внутри строки нужны сами двойные кавычки. Представьте, что мы хотим вывести такой текст:
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""Программа должна вывести на экран эту фразу в точности. Обратите внимание на кавычки в начале и в конце фразы.
Полезное
Ваше упражнение проверяется по этим тестам
import static org.assertj.core.api.Assertions.assertThat;
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.PrintStream;
class AppTest {
public static void main(String[] args) {
final var expected = "\"Khal Drogo's favorite word is \"athjahakar\"\"";
ByteArrayOutputStream out = new ByteArrayOutputStream();
System.setOut(new PrintStream(out));
App.main(null);
final var actual = out.toString().trim();
System.setOut(new PrintStream(new FileOutputStream(FileDescriptor.out)));
System.out.println(actual);
assertThat(actual).isEqualTo(expected);
}
}Решение учителя откроется через:
20:00
