Символы 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-последовательности

ЛитералЗначение
\bbackspace
\ttab
\nline feed
\fform feed
\rcarriage 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.