Символы char в Java
char занимает 16 бит и хранит значение от 0 до 65_535 включительно. Это одна code unit UTF-16, а не обязательно целый Unicode-символ.
char latin = 'A';
char cyrillic = '\u0416'; // Ж
char newline = '\n';
char backslash = '\\';
char quote = '\'';Unicode escape обрабатывается очень рано компилятором, еще до обычного разбора токенов. Поэтому невидимые escapes в комментариях тоже могут влиять на исходник; в обычном тексте безопаснее писать символ прямо или формировать его программно.
Code unit и code point
Некоторые символы вне Basic Multilingual Plane представлены surrogate pair:
String text = "A😀";
text.length(); // 3 char/code units
text.codePointCount(0, text.length()); // 2 code points
text.charAt(1); // только high surrogate
text.codePointAt(1); // полный code pointЧтобы идти по code points:
text.codePoints().forEach(System.out::println);Даже code point не всегда равен пользовательскому «символу»: буква и combining mark либо emoji sequence могут образовывать одну grapheme cluster.
Escape-последовательности
| Литерал | Значение |
|---|---|
\b | backspace |
\t | tab |
\n | line feed |
\f | form feed |
\r | carriage return |
\" | двойная кавычка |
\' | одинарная кавычка |
\\ | обратная косая черта |
char участвует в числовых преобразованиях; подробности — Перевод кода в char и обратно.
На собеседовании
- Диапазон char?
0..65535. - Что хранит char? Одну UTF-16 code unit.
- Почему
"😀".length() == 2? Символ кодируется surrogate pair. - Как обходить code points?
String.codePoints()илиcodePointAtсcharCount. - Равен ли code point видимому символу? Не всегда из-за grapheme clusters.