





1. Список примитивных типов
В Java есть 8 базовых примитивных типов. Примитивными их называют потому, что значения этих типов не являются объектами и хранятся прямо внутри переменных.
Вот таблица, которая содержит краткую информацию по этим типам:
Тип | Размер, байт |
Диапазон значений | Значение по умолчанию | Описание |
---|---|---|---|---|
byte |
1 | -128 .. 127 | 0 |
Самое маленькое целое — один байт |
short |
2 | -32,768 .. 32,767 | 0 |
Короткое целое, два байта |
int |
4 | -2*109 .. 2*109 | 0 |
Целое число, 4 байта |
long |
8 | -9*1018 .. 9*1018 | 0L |
Длинное целое, 8 байт |
float |
4 | -1038 .. 1038 | 0.0f |
Дробное, 4 байта |
double |
8 | -10308 .. 10308 | 0.0d |
Дробное, двойной длины, 8 байт |
boolean |
1 | true , false |
false |
Логический тип (только true & false ) |
char |
2 | 0 .. 65,535 | '\u0000' |
Символы, 2 байта, все больше 0 |
Кстати, важный нюанс. Если вы объявили переменную-класса (поле класса) или статическую переменную-класса, и не присвоили ей никакого значения, она инициализируется значением по умолчанию. Список таких значений приведен в таблице.
Локальные переменные методов не имеют значений по умолчанию, и если вы не присвоили такой переменной никакого значения, она считается не инициализированной и использовать ее значение нельзя.
Но давайте вернемся к примитивным типам и рассмотрим их подробнее
2. Целые типы
В языке Java аж 4 целых типа: byte
, short
, int
и long
. Они отличаются размером и диапазоном значений, которые могут хранить.
Тип int
Самым часто используемым является тип int
. Его название происходит от Integer (целый). Все целочисленные литералы в коде имеют тип int
(если в конце числа не указана буква L
, F
или D
).
Переменные этого типа могут принимать значение от -2,147,483,648
до +2,147,483,647
.
Это достаточно много и хватает почти для всех случаев жизни. Почти все функции, которые возвращают число, возвращают число типа int
.
Примеры:
Код | Пояснение |
---|---|
|
Метод length() возвращает длину строки |
|
Поле length содержит длину массива. |
Тип short
Тип short
получил свое название от short int
. Его еще называют короткое целое. В отличие от типа int
, его длина всего два байта и возможный диапазон значений от -32,768
до +32,767
.
То есть в нем даже число миллион не сохранишь. Даже 50 тысяч. Это самый редко используемый целочисленный тип в Java. В основном его используют, когда хотят сэкономить на памяти.
Допустим, у вас ситуация, когда заранее известно, что значения с которыми вы работаете не превышает 30 тысяч, и таких значений миллионы.
Например, вы пишете приложение, которое обрабатывает картинки сверхвысокой четкости: на один цвет приходится 10
бит. А точек у вас в картинке — миллион. И вот тут уже играет роль, используете вы тип int
или short
.
Тип long
Этот тип получил свое название от long int
— его еще называют длинное целое. В отличие от типа int
, у него просто гигантский диапазон значений: от -9*1018
до
+9*1018
Почему же он не является основным целым типом?
Все дело в том, что Java появилась еще в середине 90-х, когда большинство компьютеров были 32-х разрядными. А это значило, что все процессоры были заточены под работу с числами из 32-х бит. С целыми числами из 64-х бит процессоры работать уже умели, но операции с ними были медленнее.
Поэтому программисты разумно решили сделать стандартным целым типом тип int
, ну а тип long
использовать только тогда, когда без него действительно не обойтись.
Тип byte
Это самый маленький целочисленный тип в Java, но далеко не самый редко используемый. Его название совпадает со словом byte
— минимальная адресуемая ячейка памяти в Java.
Размер допустимых значений типа byte
не так уж велик: от -128
до +127
. Но не в этом его сила. Тип byte
чаще всего используется, когда нужно хранить в памяти большой блок обезличенных данных. Массив типа byte
просто идеально подходит для этих целей.
Например, вам нужно куда-то скопировать файл.
Вам не нужно обрабатывать содержимое файла: вы просто хотите создать область памяти (буфер), скопировать в нее содержимое файла, а затем записать эти данные из буфера в другой файл. Массив типа byte
— то, что нужно для этих целей.
Тем более, что в переменной-типа-массив хранится только ссылка на область памяти. При передаче значения этой переменной в какой-то метод произойдет только передача адреса в памяти, а сам блок памяти копироваться не будет.
byte[] buffer = new byte[1024*1024];
FileInputStream sourceFile = new FileInputStream("c:\\data.txt");
FileOutputStream destFile = new FileOutputStream("c:\\output.txt");
while (true)
{
int size = sourceFile.read(buffer); // читаем данные из файла в буфер
destFile.write(buffer, 0, size); // записываем данные из буфера в файл
// прекращаем копирование, если буфер заполнен не полностью
if (size < buffer.length) break;
}
sourceFile.close();
destFile.close();
3. Вещественные типы
Среди примитивных типов также есть два вещественных. Хотя это не совсем точное название. Официально они называются числа с плавающей точкой — floating point numbers. Название происходит из стандарта, когда целую и дробную часть числа разделяет точка (а не запятая).
В каждой стране свои стандарты для записи чисел (внезапно!).
Многие из нас привыкли писать точки для разделения тысяч и запятую для отделения дробной части: например, миллион целых и 153 тысячных
мы бы записали так 1.000.000,153
. А вот в США, где жили создатели Java, принят другой стандарт: 1,000,000.153
В Java есть два примитивных типа с плавающей точкой: double
и float
.
Как мы уже говорили ранее, эти типы внутри устроены специфическим образом: фактически внутри каждой переменной этих типов находится не одно число, а два:
Например, дробное число 987654.321
можно представить как 0.987654321*106
. Поэтому в памяти оно будет представлено как два числа 987654321
(мантисса — значащая часть числа) и 6
(экспонента — степень десятки)
Тип float
Само название типа float
происходит от floating point number. Размер этого типа совсем небольшой — всего 4 байта (32 бита), но он может хранить значения от -3.4*1038
до 3.4*1038
. Под мантиссу отдается 24 бита, под экспоненту — 8 бит. Этот тип способен хранить всего 8 значащих цифр.
Такой подход позволяет хранить гораздо большие числа, чем int
, используя все те же 4 байта. Но при этом мы жертвуем точностью. Часть памяти расходуется на хранение мантиссы, поэтому такие числа хранят всего 6-7 знаков после запятой, остальные отбрасываются.
Пример:
Код | Значение переменной |
---|---|
|
123.45679 |
|
12346.0 |
|
-1.2345679 |
Как видите, основной недостаток этого типа — очень маленькое количество значащих цифр и потеря точности уже в восьмой цифре. Поэтому тип float
не сильно популярен среди Java-программистов.
Тип double
Тип double
является стандартным типом с плавающей точкой. Его название происходит от double floating point. Его еще называют числом с плавающей точкой двойной точности. Все вещественные литералы по умолчанию имеют тип double
.
Этот тип занимает 8 байт памяти (64 бита) и может хранить значения от -1.7*10308
до 1.7*10308
. Важным моментом является то, что под его мантиссу отводится 53 бита, а остальные 11 – под экспоненту.
Это позволяет хранить 15-17 значащих цифр.
Пример:
Код | Значение переменной |
---|---|
|
1234567890.1234567 |
|
1234567890.1234512 |
|
1234567890.1357913 |
Такая точность, особенно в сравнении с типом float
, является определяющей: 99% всех операций с вещественными числами выполняются с типом double
.
Под экспоненту выделяется 11
бит, что позволяет хранить степень десятки от -323
до +308
(степень двойки — от -1024
до +1023
). Тип double
легко может хранить число с сотней нулей после запятой:
Код | Значение переменной |
---|---|
|
600.0 |
4. Бесконечность
Числа с плавающей точкой обладают еще одной интересной особенностью: они позволяют хранить специальное значение, обозначающее бесконечность. Причем может быть положительная бесконечность и отрицательная бесконечность.
Примеры:
Код | Примечание |
---|---|
|
|
|
|
|
|
Если бесконечность умножить на число, получится бесконечность. Если к бесконечности добавить число, получится бесконечность. Очень удобно.
Не число (NaN
)
Любые операции с бесконечностью дают бесконечность. В целом да, но не все.
Числа с плавающей точкой могут хранить еще одно специальное значение — NaN
. Это сокращение от Not a Number (не число).
В математике, если разделить бесконечность на бесконечность, должна возникнуть неопределенность.
Ну, а в Java, если разделить бесконечность на бесконечность, будет NaN
.
Примеры:
Код | Примечание |
---|---|
|
|
|
|
|
|
Любая операция с NaN
дает NaN
.
5. Тип char
Среди примитивных типов в Java есть еще один, который заслуживает особого внимания — тип char
. Его название происходит от слова Character, а сам тип используется для того, чтобы хранить символы.
А ведь символы — это как раз то, из чего состоят строки: каждая строка содержит в себе массив символов.
Но еще интереснее тот факт, что тип char
— это и числовой тип тоже! Так сказать, тип двойного назначения.
Все дело в том, что на самом деле тип char
хранит не символы, а коды символов из кодировки Unicode. Каждому символу соответствует число — числовой код символа.
Каждая переменная типа char
занимает в памяти два байта (как и тип short
). Но в отличие от типа short
, целочисленный тип char
— беззнаковый, и может хранить значения от 0
до 65,535
.
Тип char
— гибридный тип. Его значения можно интерпретировать и как числа (их можно складывать и умножать), и как символы. Так было сделано потому, что хоть символы и имеют визуальное представление, для компьютера они в первую очередь просто числа. И работать с ними как с числами гораздо удобнее.
Unicode
Unicode — это специальная таблица (кодировка), которая содержит все символы мира. И у каждого символа есть свой номер. Выглядит она примерно так:
Присвоить значение переменной типа char
можно разными способами.
Код | Описание |
---|---|
|
Переменная а будет содержать латинскую букву А . |
|
Переменная а будет содержать латинскую букву А . Ее код как раз 65 . |
|
Переменная а будет содержать латинскую букву А .Ее код как раз 65 , что равно 41 в шестнадцатеричной системе.
|
|
Переменная а будет содержать латинскую букву А .Ее код как раз 65 , что равно 41 в шестнадцатеричной системе.Два лишних нуля ничего не меняют. |
|
Переменная а будет содержать латинскую букву А .Еще один способ задать символ по его коду. |
Чаще всего просто указывают символ в кавычках (как в первой строке таблицы). Хотя популярен и последний способ. Его преимущество в том, что его можно использовать в строках.
И как мы говорили, тип char
— это и целочисленный тип тоже, поэтому можно написать так:
Код | Вывод на экран |
---|---|
|
На экран будет выведена латинская буква B .Потому что: A – 65 B – 66 C – 67 |
Работа с типом char
Каждый символ char
— это в первую очередь число (код символа), а потом уже символ. Зная код символа, всегда можно получить его в программе. Пример:
Код | Вывод на экран |
---|---|
|
|
Стандартные коды
Вот самые известные коды символов:
Символы | Коды |
---|---|
0 , 1 , 2 , ... 9 |
48 , 49 , 50 , ... 57 |
a , b , c , ... z |
97 , 98 , 99 , ... 122 |
A , B , C , ... Z |
65 , 66 , 67 , ... 90 |
6. Тип boolean
И последний примитивный тип — это boolean
.
Как вы уже знаете, он может принимать только два значения: true
и false
.
Собственно, все, что можно знать об этом типе, вы уже знаете.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ