Тема 2. Типы данных в Java - BelyiZ/JavaCourses GitHub Wiki

Содержание:

  1. Переменные и константы
    1. Создание переменных
  2. Обзор типов данных в Java
    1. Примитивные типы данных
      1. Целочисленные типы
      2. Дробные числа
      3. Логический тип
    2. Ссылочные типы данных
    3. Строки
  3. Массивы
  4. Список литературы/курсов

Переменные и константы

Вспомните уроки математики, когда мы заменяли неизвестное число символом "х" и проводили над ним арифметические операции, а в конечном итоге узнавали, что эта переменная могла принимать любое из набора вычисленных значений. В Java все примерно аналогично.

Переменная - это определенный участок памяти, зарезервированный под хранение данных определенного типа.

В программе мы работаем со значением переменной, можем менять его или использовать для вычислений. Оно может быть любым и меняться в ходе выполнения программы. Единственное, что мы про него знаем - тип.

Создание переменных

Для того чтобы создать переменную, нужно сначала указать ее тип, затем название, далее необходимо поставить оператор присваивания (символ равно "=") и ее значение. Например, так можно создать переменную, которая будет хранить текущий год:

short year = 2018;

Тут short - тип данных, year - название переменной, а 2018 - значение.

В случае, когда значение не должно меняться после его первоначальной установки, используются константы. Работа с константами ведется так же, как и с переменными, за исключением того, что нельзя изменять их значения. Для создания константы достаточно добавить ключевое слово final:

final short year = 2018;

Теперь изменить значение константы year нельзя, а если мы попытаемся, компилятор обязательно сообщит об ошибке.

Обзор типов данных

Каждому типу соответствует определенный объем используемой памяти. Также в зависимости от типа определяется, что конкретно будет представлять собой переменная: непосредственно ее значение или ссылку на объект, который "оборачивает" значение и добавляет к ним дополнительную функциональность. В соответствии с этим, типы данных в Java можно разделить на две группы: примитивные и ссылочные.

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

Примитивные типы данных хранят в себе только значение и не имеют специальных возможностей. Всего в Java существует 8 примитивных типов. По содержимому их можно разделить на три группы:

  1. Целые числа
  2. Числа с плавающей точкой (дробные)
  3. Логический

Рассмотрим их отдельно.

Целочисленные типы

byte
Размер в памяти: 8 бит (1 байт)
Интервал значений: от -128 до 127
Значение по умолчанию: 0

Этот тип данных зачастую используется для экономии занимаемого места в памяти, так как ему необходимо в 4 раза меньше наиболее часто используемого типа int.

Примеры:

byte a = 123; 
byte b = -37;

short
Размер в памяти: 16 бит (2 байта)
Интервал значений: от -32768 до 32767
Значение по умолчанию: 0

Этот тип данных зачастую используется для экономии занимаемого места в памяти, так как ему необходимо в 2 раза меньше наиболее часто используемого типа int.

Примеры:

short a = 12345;
short b = -572;

int
Размер в памяти: 32 бита (4 байта)
Интервал значений: от -2147483648 до 2147483647
Значение по умолчанию: 0

Самый распространенный целочисленный примитивный тип данных используемый в Java.

Примеры:

int a = 3345345; 
int b = -3454353;

long
Размер в памяти: 64 бита (8 байт)
Интервал значений: от -9223372036854775808 до 9223372036854775807
Значение по умолчанию: 0L

Используется только для случаев, когда диапазона типа int недостаточно, так как занимает в два раза больше места в памяти. Для явного указания, что число нужно создать с типом long, используется буква L после значения.

Примеры:

long a = 1234567890L;
long b = -3456L;
long c = 123L;

char
Размер в памяти: 16 бит (2 байта)
Интервал значений: символы из кодировки UTF-16 (0 - 65535)
Значение по умолчанию: 0

В качестве значения у этого типа используется один из символов в кодировке UTF-16. Инициализировать можно, указав сам символ в одинарных кавычках, число - порядковый номер в кодировке или полный код символа.

Примеры:

char a = 'j';
char c = '\u1234';

Дробные числа

float
Размер в памяти: 32 бита (4 байта)
Интервал значений: от -1.4e-45f до 3.4e+38f
Значение по умолчанию: 0.0f

Используется для хранения дробных чисел, но из-за недостаточной точности и округлений во время арифметических операций его нельзя использовать для случаев, где нужны точные данные, например, при вычислениях денежных средств. Для явного указания, что число нужно создать с типом float, используется буква f после значения.

Примеры:

float a = 123.4f;
float b = 345f;
float c = -987.0f;

double
Размер в памяти: 64 бита (8 байт)
Интервал значений: от -4.9e-324 до 1.7e+308 Значение по умолчанию: 0.0d

Как и float, используется для хранения дробных чисел, но имеет более широкий диапазон значений и большую точность. Из-за особенностей работы с числами с плавающей точкой, приводящих к округлению во время арифметических операций, данный тип нельзя использовать для случаев, где нужны точные данные, например, при вычислениях денежных средств. Для явного указания, что число нужно создать с типом double, используется буква d после значения.

Примеры:

double a = 123.4d;
double b = 345d;
double c = -987.0d;
double d = -342d;

Логический тип

boolean
Размер в памяти: 8 или 32 бита (1 или 4 байта)
Интервал значений: true или false
Значение по умолчанию: false

Может принимать всего два значения: true (истина) или false (ложь). В памяти мог бы занимать всего один бит (0 или 1), но в реальности занимает 1 байт находясь в массиве и 4 байта вне него.

Примеры:

boolean a = true;
boolean b = false;

Ссылочные типы данных

Ссылочными типами данных является все остальное. Главное отличие от примитивов в том, что созданная переменная содержит не само значение, а ссылку на соответствующий объект в куче (это область памяти в Java, об этом будем говорить позже). Такое обертывание предоставляет разработчику широкий набор функциональности. Во-первых, есть возможность создать собственные методы, привязанные к переменной, которые будут работать с данными внутри нее. Во-вторых, это дает возможность создавать собственные типы данных.

Для каждого примитивного типа существует свой класс-обертка:

byte    → Byte
short   → Short
int     → Integer
long    → Long
char    → Character
float   → Float
double  → Double
boolean → Boolean

В Java существует возможность переводить данные из одного типа в другой, это называется приведением типов. Не все типы между собой приводимы. Преобразование примитива в соответствующий ему объект называется boxing (боксинг). Обратная операция - unboxing (анбоксинг). Рассмотрим несколько примеров:

int a = 5; // примитивный тип
Integer b = 5; // ссылочный тип

int c = (int) b; // unboxing
Integer d = Integer.valueOf(a); // boxing

double e = (double) c; // приведение типов int → double 

В отличие от примитивных типов, ссылочные имеют одинаковое значение по умолчанию - null. Это ключевое слово в Java означает отсутствие значения. Для таких переменных сильно ограничен набор допустимых операций. В следующих темах мы рассмотрим подробнее, как правильно работать с null, и какие проблемы могут возникать из-за переменных без значения.

Строки

Особое внимание следует уделить типу String, ведь это самый часто используемый тип данных в Java. Он используется для хранения значений строк и операций над ними. В отличие от типа char, объект String содержит не один символ, а целый набор.

Для создания строк используются двойные кавычки, например:

String a = "I'm a string.";

Любой объект или примитив можно преобразовать в строку. Для ссылочных типов достаточно вызвать у них метод toString(). Примитивы можно сложить с пустой строкой. Примеры создания строк из других типов:

Integer a = 5;
double b = 1.5;
boolean c = false;

String d = a.toString();
String e = b + "";
String f = String.valueOf(c);
String g = a + "";

Более подробно мы будем рассматривать работу со строками позднее

Массивы

Массив — это упорядоченная последовательность переменных одного типа. У каждого элемента массива есть свой порядковый номер - индекс. Размер массива, т.е. количество элементов в нем, определяется в момент его создания и не может быть изменен в ходе выполнения программы. Обратите внимание, что нумерация элементов массива начинается с нуля, а индекс последнего элемента будет на единицу меньше его длины.

Создать массив можно, добавив к типу данных или названию переменной квадратные скобки:

int[] a = new int[10]; // массив из десяти нулей
int b[] = new int[10]; // такой вариант создания массива используется редко

Так мы создаем массивы, которые будут заполняться значениями по умолчанию. Но, если на момент инициализации нам уже известны все или некоторые значения, мы можем создать массив сразу с ними:

int[] a = {1, 4, 6};
String[] b = {"abc", null, "123"};

Для работы с конкретными элементами массива (получения или изменения значения) необходимо указать индекс при обращении к переменной:

int[] a = {1, 5, 8, 2}; // создали массив
a[2] = 3; // в третьей ячейке изменили значение с 8 на 3
int b = a[0]; // создали переменную со значением из первой ячейки массива

В качестве индекса можно использовать числа или выражения, которые создают положительное значение типа int. Поэтому при вычислении выражения с типом long, следует преобразовать результат в int, иначе получите ошибку. С типами short и byte проблем не будет, так как они полностью укладываются в диапазон int.

Для получения длины массива можно использовать встроенное в него поле length:

Long[] a = new Long[12345];
int b = a.length; // переменная получит значение 12345 

#Список литературы/курсов

  1. https://metanit.com/java/tutorial/2.12.php
  2. https://javarush.ru/groups/posts/massivy-java

Тема 1. Введение в Java | Оглавление | Тема 3. Операторы в Java