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
являются константами: по сути тоже кэшируются.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ