Перейти к содержанию

Введение в примитивы Java

Язык программирования Java имеет восемь примитивных типов данных.

Из этой статьи узнаем, что представляют собой эти примитивы, рассмотрев каждый тип.

Примитивные типы данных

В Java определены восемь примитивов: int, byte, short, long, float, double, boolean и char. Они не считаются объектами и представляют необработанные значения.

Они хранятся непосредственно в стеке (ознакомьтесь с этой статьей для получения дополнительной информации об управлении памятью в Java).

Рассмотрим размер хранилища, значения по умолчанию и примеры использования каждого типа.

Начнем с краткой справки:

ТипРазмер (бит)МинимумМаксимумПример
byte8-2727– 1byte b = 100;
short16-215215– 1short s = 30_000;
int32-231231– 1int i = 100_000_000;
long64-263263– 1long l = 100_000_000_000_000;
float32-2-149(2-2-23)·2127float f = 1.456f;
double64-2-1074(2-2-52)·21023double f = 1.456789012345678;
char160216– 1char c = ‘c’;
boolean1boolean b = true;

Int

Первый примитивный тип данных, который собираемся рассмотреть, – это int. Также известный как целое число, тип int содержит широкий диапазон значений не дробных чисел.

В частности, Java хранит его, используя 32 бита памяти. Другими словами, он может представлять значения от -2 147 483 648 (-231) до 2 147 483 647 (231-1).

В Java 8 можно хранить целое число без знака до 4 294 967 295 (232-1) с помощью новых специальных вспомогательных функций.

Можно просто объявить int:

int x = 424_242;

int y;

Значение по умолчанию для int, объявленного без присваивания, равно 0.

Если переменная определена в методе, необходимо присвоить значение, прежде чем сможем ее использовать.

Можно выполнять все стандартные арифметические операции над целыми числами. Просто имейте в виду, что десятичные значения будут обрезаны при выполнении этих операций с целыми числами.

Byte

Byte – это примитивный тип данных, похожий на int, за исключением того, что он занимает всего 8 бит памяти. Вот почему его называют байтом. Поскольку размер памяти очень мал, байт может содержать только значения от -128 (-27) до 127 (27 – 1).

Вот как можно создать byte:

byte b = 100;

byte empty;

Значение byte по умолчанию также равно 0.

Short

Следующий в списке примитивных типов данных в Java – short. Если хотим сэкономить память, а byte слишком мал, можно использовать тип, промежуточный между byte и int short.

При 16-битной памяти это половина размера int и вдвое больше размера byte. Его диапазон возможных значений составляет от -32 768 (-215) до 32 767 (215 – 1).

Short объявляется следующим образом:

short s = 20_020;

short s;

Также, как и в других типах, значение по умолчанию равно 0. Можно использовать для него все стандартные арифметические операции.

Long

Последний примитивный тип данных, связанный с целыми числами, – long.

Long – старший брат int. Он хранится в 64-битной памяти, поэтому может содержать значительно больший набор возможных значений.

Возможные значения long находятся в диапазоне от -9 223 372 036 854 775 808 (-263) до 9 223 372 036 854 775 807 (263 – 1).

Можно просто объявить его так:

long l = 1_234_567_890;

long l;

Как и в случае с другими целочисленными типами, значение по умолчанию также равно 0.

Можно использовать всю арифметику с типом long, которая работает с типом int.

Float

Основные дробные числа в Java представлены при помощи типа float. Это десятичное число одинарной точности. Это означает, что если преодолеем шесть знаков после запятой, число станет менее точным и больше приблизительным.

В большинстве случаев нас не волнует потеря точности. Но если расчет требует абсолютной точности (например, финансовые операции, высадка на Луну и т. д.), нужно использовать специальные типы, предназначенные для этой работы. Для получения дополнительной информации ознакомьтесь с классом Java Big Decimal.

Этот тип хранится в 32 битах памяти, как и int. Однако из-за плавающей десятичной точки его диапазон сильно отличается. Он может представлять как положительные, так и отрицательные числа. Наименьшее десятичное число – 1,40239846 x 10-45, а наибольшее значение – 3,40282347 x 1038.

Объявляем float так же, как и любой другой тип:

float f = 3.145f;

float f;

Значение по умолчанию – 0,0 вместо 0. Кроме того, обратите внимание, что добавляем обозначение f в конец литерального числа, чтобы определить число с плавающей запятой. В противном случае Java выдаст ошибку, поскольку тип десятичного значения по умолчанию – double.

Можно выполнять все стандартные арифметические операции над числами с плавающей запятой. Однако важно отметить, что мы выполняем арифметику с плавающей запятой совершенно иначе, чем арифметику с целыми числами.

Double

Далее рассмотрим double. Его название происходит от того факта, что это десятичное число двойной точности.

Оно хранится в 64-битной памяти. Это означает, что оно представляет гораздо больший диапазон возможных чисел, чем float.

Хотя оно страдает тем же ограничением точности, что и float. Диапазон составляет от 4,9406564584124654 x 10-324 до 1,7976931348623157 x 10308. Этот диапазон также может быть положительным или отрицательным.

Объявление double аналогично другим числовым типам:

double d = 3.13457599923384753929348D;

double d;

Значение по умолчанию также равно 0,0, как и для float. Подобно float, добавляем букву D, чтобы обозначить литерал как double.

Boolean

Самый простой примитивный тип данных – boolean. Он может содержать только два значения: true или false. Он хранит свое значение в одном бите.

Однако для удобства Java дополняет значение и сохраняет его в одном байте.

Вот как объявляется логическое значение:

boolean b = true;

boolean b;

Char

Последний примитивный тип данных, на который стоит обратить внимание, – это char.

Также называемый символом, char представляет собой 16-разрядное целое число, представляющее символ в кодировке Unicode. Его диапазон составляет от 0 до 65 535. В Юникоде это представляет от ‘\u0000’ до ‘\uffff’.

Список всех возможных значений Unicode можно найти на таких сайтах, как Unicode Table.

Давайте теперь объявим char:

char c = 'a';

char c = 65;

char c;

При определении переменных можно использовать любой символьный литерал, и они будут автоматически преобразованы в свою кодировку Unicode. Значение символа по умолчанию – ‘/u0000’.

Переполнение (Overflow)

Примитивные типы данных имеют ограничения по размеру. Но что произойдет, если попытаемся сохранить значение, превышающее максимальное значение?

Мы сталкиваемся с ситуацией, называемой переполнением.

Когда целое число переполняется, оно возвращается к минимальному значению и начинает отсчет оттуда.

Числа с плавающей запятой переполняются, возвращая бесконечность:

int i = Integer.MAX_VALUE;
int j = i + 1;
// j перевернется в -2_147_483_648

double d = Double.MAX_VALUE;
double o = d + 1;
// o будет бесконечностью

Недостаточный поток (Underflow) – это та же проблема, за исключением того, что она связана с сохранением значения меньше минимального значения. Когда числа переполняются, они возвращают 0,0.

Autoboxing

Каждый примитивный тип данных также имеет полную реализацию класса Java, которая может его обернуть. Например, класс Integer может обернуть int. Иногда возникает необходимость преобразовать примитивный тип в оболочку объекта (например, используя их с дженериками).

К счастью, Java может выполнить это преобразование автоматически. Этот процесс называется Autoboxing:

Character c = 'c';

Integer i = 1;

Заключение

В этой статье рассмотрели восемь примитивных типов данных, поддерживаемых в Java. Это стандартные блоки, используемые большинством, если не всеми, Java-программами, поэтому стоит понять, как они работают.

Оригинал