W3docs

Символы в Java (char)

Представление одиночных символов в Java с помощью примитива char и класса-обёртки Character с его вспомогательными методами.

char — один из восьми примитивных типов данных Java. Он хранит одно 16-битное беззнаковое значение — кодовую единицу UTF-16. Для большинства символов латиницы, кириллицы, греческого, арабского, CJK и многих других письменностей этого достаточно для хранения целого символа. Для эмодзи и некоторых редких письменностей один воспринимаемый пользователем символ занимает два charа (суррогатная пара).

На этой странице рассказывается о том, как записывать литералы типа char, о том, что char по сути является небольшим целым числом, о классе-обёртке Character для Unicode-совместимой классификации, о ловушке суррогатных пар и о массивах char[]. Как только вы освоите одиночные символы, можно переходить к классу String, который строится на их основе.

Литералы char

Символьный литерал — это один символ, заключённый в одинарные кавычки:

char a = 'A';
char z = 'z';
char digit = '7';
char punct = '!';

Можно также использовать управляющие последовательности и Unicode-экранирования:

char newline = '\n';
char tab = '\t';
char quote = '\'';
char back = '\\';
char copy = '©';   // ©
char pi = 'π';     // π

char — 16-битное целое число

Значение типа char внутренне является беззнаковым 16-битным целым числом. С ним можно выполнять арифметические операции и преобразовывать к int и обратно:

char c = 'A';
int code = c;             // 65 — implicit widening to int
char next = (char) (c + 1); // 'B'
char digit5 = (char) ('0' + 5); // '5'

Классический приём для проверки диапазонов символов:

boolean isUpper = c >= 'A' && c <= 'Z';
boolean isDigit = c >= '0' && c <= '9';
Внимание

Поскольку char расширяется до int, выражение 'A' + 'B' даёт целое число 131, а не строку "AB". Внутри System.out.println("x" + c) объект String слева вызывает конкатенацию, но c1 + c2 само по себе — это арифметика. Используйте приведение (char), когда нужен символьный результат.

Обёртка Character

Character — это класс-обёртка. Он содержит десятки статических вспомогательных методов для классификации и преобразования символов — более надёжных, чем стиль c >= '0' выше, поскольку они поддерживают Unicode:

Character.isLetter('A');         // true
Character.isDigit('7');          // true
Character.isLetterOrDigit('é');  // true
Character.isWhitespace(' ');     // true
Character.isUpperCase('A');      // true
Character.isLowerCase('a');      // true
Character.toUpperCase('a');      // 'A'
Character.toLowerCase('A');      // 'a'
Character.getNumericValue('7');  // 7
Character.toString('A');         // "A"

Предпочитайте методы Character ручным проверкам диапазонов, если текст может содержать не-ASCII символы.

char — одна кодовая единица UTF-16, а не всегда один пользовательский символ

Это тонкий момент. Строки Java хранятся в кодировке UTF-16. Для символов с кодовыми точками до U+FFFF (Основная многоязычная плоскость — большинство языков и знаков препинания) одна кодовая точка помещается в один char. Для символов выше U+FFFF — большинства эмодзи, древних письменностей и некоторых музыкальных символов — требуются два charа (суррогатная пара).

String emoji = "🎉";
System.out.println(emoji.length());           // 2 — surrogate pair
System.out.println(emoji.codePointCount(0, 2)); // 1 — one user character

Если ваш код обрабатывает пользовательский текст, который может содержать эмодзи или редкие письменности, предпочитайте методы, работающие с кодовыми точками (String.codePoints(), Character.toString(int), Character.isLetter(int)), а не те, что основаны на char.

char[] — массивы символов

char[] иногда используется для высокопроизводительной обработки текста или для хранения паролей (содержимое массива можно обнулить после использования, тогда как неизменяемую String обнулить нельзя):

char[] greeting = {'H', 'e', 'l', 'l', 'o'};
String s = new String(greeting);     // "Hello"

char[] back = s.toCharArray();

Демонстрация

java— editable, runs on the server

Что дальше

Класс Math в Java — библиотека статических методов для арифметики, выходящей за рамки +, -, *, /.

Практика

Практика
Какие утверждения о char в Java верны?
Какие утверждения о char в Java верны?
Was this page helpful?