1. Класс Integer
Integer хорош еще и тем, что это класс, а значит, у него могут быть поля и методы. И, конечно, они у него есть. Даже много — несколько десятков. Поэтому мы рассмотрим самые основные из них.
У класса Integer есть два поля, которые содержат максимальное и минимальное значение типа int:
| Поле | Описание |
|---|---|
|
Максимальное значение типа int |
|
Минимальное значение типа int |
Иногда хочется присвоить переменной самое маленькое или самое большое значение типа int. Чтобы не загромождать код непонятными константами, можно очень красиво написать:
| Код | Описание |
|---|---|
|
|
Также у класса Integer есть несколько интересных методов, вот они:
| Методы | Описание |
|---|---|
|
Возвращает строку — шестнадцатеричное представление числа |
|
Возвращает строку — двоичное представление числа |
|
Возвращает строку — восьмеричное представление числа |
|
Оборачивает переданный int в Integer |
|
Возвращает число, полученное из строки |
Раньше вы уже сталкивались со статическим методом Integer.parseInt(). Напомним, как он работает:
int имя = Integer.parseInt(строка);
Если в метод parseInt() передать строку, содержащую число (только цифры), он распарсит эту строку и вернет число, которое в ней содержится.
Остальные методы тоже полезны. Например, некоторые из них могут преобразовывать переданное число в строку в двоичном, восьмеричном или шестнадцатеричном виде.
2. Класс Double
Класс Double, в общем-то, аналогичен классу Integer, только является оберткой не для типа int, а для типа double. У него тоже есть интересные нам поля и методы, рассмотрим некоторые из них:
Интересных полей у класса Double шесть:
| Поле | Описание |
|---|---|
|
Минус бесконечность |
|
Плюс бесконечность |
|
Минимальное значение экспоненты (2x) |
|
Максимальное значение экспоненты (2x) |
|
Минимальное значение типа double |
|
Максимальное значение типа double |
Бесконечность
Если вы разделите -1.0 на 0.0, получите отрицательную бесконечность, если 1.0 на 0.0 — положительную бесконечность. Тип double может не только делить на ноль, но и хранить такие значения.
Экспонента числа double
С экспонентой тоже все просто. Число double внутри состоит из мантисы и экспоненты. Только вот значение экспоненты — это не 10х, а 2х. Если экспонента вырастет на 1, итоговое значение числа станет больше в два раза.
MIN_EXPONENT == -1024, в итоге получаем 2-1024 примерно равно 10-308
Также у класса Double есть интересные методы:
| Методы | Описание |
|---|---|
|
Возвращает строку — шестнадцатеричное представление числа |
|
Проверяет, является ли переданное число бесконечностью. |
|
Проверяет, является ли переданное число NaN |
|
Оборачивает переданный double в Double |
|
Возвращает число, полученное из строки |
Из интересного можно отметить наличие метода isInfinite(), который возвращает true, если переданное в него число было плюс или минус бесконечность.
Аналогично работает и метод isNaN() — проверяет, является ли переданное в него число NaN: специальная константа, обозначающая неопределенность (Not a Number, Не число).
3. Класс Character
Класс Character в первую очередь интересен большим количеством утилитных статических методов, которые позволяют проверять символы на принадлежность разным категориям.
Примеры
| Методы | Описание |
|---|---|
|
Проверяет, является ли символ символом алфавита |
|
Является ли символ буквой |
|
Является ли символ цифрой |
|
Является ли символ пробелом, символом переноса строки или смены параграфа (коды: 12, 13, 14) |
|
Является ли символ разделителем: пробел, tab, и т.д. |
|
Символ в нижнем регистре — строчные буквы? |
|
Символ в верхнем регистре — заглавные буквы? |
|
Преобразует символ в нижний регистр |
|
Преобразует символ в верхний регистр |
Особенностью данных методов является то, что они работают со всеми известными алфавитами: символы арабских цифр будут определяться как цифры и т.п.
4. Класс Boolean
Тип Boolean практически такой же, как тип boolean. Отличия минимальны.
Ниже мы покажем упрощенный вариант класса Boolean:
| Код | Описание |
|---|---|
|
Константы: TRUE и FALSE Переменная-значение Конструктор класса Boolean Метод возвращает значение внутренней переменной-значения Этот статический метод умеет преобразовывать true в TRUE и false в FALSE. |
В типе Boolean есть две константы (два поля):
| Константы класса | Аналог типа boolean | Описание |
|---|---|---|
|
|
истина |
|
|
ложь |
Работать с ними можно так же, как и с типом boolean:
| Код | Примечание |
|---|---|
|
Boolean — единственный класс, который можно писать внутри условия |
|
Все три переменные равны true/TRUE |
|
Константы можно сравнивать и через equals и через == Так тоже будет работать. |
Autoboxing тут работает отлично, поэтому можете пользоваться этим типом так же, как типом boolean: никаких подводных камней тут нет.
| Как записано | Как это работает |
|---|---|
|
|
А вот как происходят сравнения между типами boolean и Boolean:
boolean a = true;
Boolean b = true; // будет равен Boolean.TRUE
Boolean c = true; // будет равен Boolean.TRUE
a == b; // true (сравниваются как примитивы по значению)
a == c; // true (сравниваются как примитивы по значению)
b == c; // true (сравниваются по ссылке, но указывают на один и тот же объект)
Если очень нужно создать независимый объект Boolean, то надо создать его явно:
boolean a = true;
Boolean b = new Boolean(true); // новый объект Boolean
Boolean c = true; // будет равен Boolean.TRUE
a == b; // true (сравниваются как примитивы по значению)
a == c; // true (сравниваются как примитивы по значению)
b == c; // false (сравниваются по ссылке, указывают на различные объекты)
И еще один пример: использование Boolean внутри if:
| Код | Примечание |
|---|---|
|
Скомпилируется и будет работать |
Скомпилируется, но работать не будет:
| Код | Примечание |
|---|---|
|
Ошибка. В этой строке кинется исключение |
5. Кэширование значений при autoboxing
А вот с целочисленными типами-обертками подводные камни есть.
Как вы уже знаете, если вы сравниваете int и Integer, Integer преобразовывается в int:
| Как записано | Как это работает |
|---|---|
|
|
Если сравнить между собой два объекта типа Integer, преобразовываться к типу int они не будут:
| Код | Вывод на экран |
|---|---|
|
|
Хоть a == c и b == c, но a != b, т.к. при сравнении a и b сравниваются ссылки. Что, в принципе, ожидаемо.
Сюрприз
Но, вот если мы заменим 500 на 100, получим совсем другой результат:
| Код | Вывод на экран |
|---|---|
|
|
Все дело в том, что при autoboxing не всегда создается действительно новый объект Integer. Для значений от -128 до 127 включительно объекты кэшируются.
В классе Integer есть скрытый массив, который хранит объекты: Integer(-128), Integer(-127), ... Integer(126), Integer(127)
Если вы напишете Integer x = 128, autoboxing создаст новый объект, а если Integer x = 127, autoboxing возьмет готовый объект из кэша (из массива).
Если вы не хотите, чтобы объект Integer брался из кэша, вам придется создать его явно, написав: Integer x = new Integer(127);
Такой кэш есть у всех типов-оберток: Integer, Long, Byte, Short, Boolean. У типа Boolean оба его значения TRUE и FALSE являются константами: по сути тоже кэшируются.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ