Символы в 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();Демонстрация
Что дальше
Класс Math в Java — библиотека статических методов для арифметики, выходящей за рамки +, -, *, /.