Типы данных Java с примерами

Узнайте о различных типах данных в Java. Узнайте о различиях между примитивными типами данных и непримитивными типами данных(или ссылочными типами данных). Мы также узнаем о размерах типов данных и лучших практиках использования типов данных в Java.

1. Как объявить переменную в Java?

В Java, как правило, типы данных связаны с переменными. Объявление переменной состоит из трех частей:

  1. Имя переменной(также называемое идентификатором) для ссылки на ячейку памяти.
  2. Тип переменной, хранящейся в ячейке памяти(он называется типом данных)
  3. Ячейка памяти для хранения значения переменной.

Второе свойство называется типом данных.

Тип данных Java
Тип данных Java

Тип данных переменной определяет диапазон значений, которые может содержать ячейка памяти. Таким образом, объем памяти, выделяемой для переменной, зависит от ее типа данных.

Например, для переменной типа данных «int» выделяется 32 бита памяти.

Java — статически типизированный язык. Это означает, что все переменные ДОЛЖНЫ быть объявлены до того, как их можно будет использовать.

boolean flag = true;int counter = 20;

2. Типы данных Java

Java поддерживает два вида типов данных:

  1. Примитивный тип данных
  2. Непримитивный или ссылочный тип данных.

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

  • Примитивный тип данных напрямую хранит значение в памяти. Например, число или символ.
  • Примитивные типы данных не являются объектами, а также не являются ссылками на объекты.
  • Значения, хранящиеся в примитивах, называются литералами.

Литерал — это представление фиксированного значения в исходном коде; литералы представлены непосредственно в коде, не требуя вычислений.

В Java имеется восемь примитивных типов данных.

Тип данных Описание Значение по умолчанию Размер памяти
булев Двоичное значение: истина или ложь ЛОЖЬ 1 бит
чар Любой символ Unicode \u0000(0) 16-битный символ Unicode
байт Значения от -128 до 127 0 8-битное знаковое значение
короткий Значения от -32768 до 32767 0 16-битное знаковое значение
инт Значения от -231 до 231-1 0 32-битное знаковое значение
длинный Значения от -263 до 263-1 0 64-битное знаковое значение
плаватьIEEE 754 с плавающей точкой 0.0 32-битное значение с плавающей точкой
двойной IEEE 754 с плавающей точкой 0.0 64-битное значение с плавающей точкой

В Java SE 7 и более поздних версиях любое количество символов подчеркивания('_') может располагаться в любом месте между цифрами числового литерала. Например, 10_000_000 является допустимым числом в Java. Подробнее

2.1.1 Преобразование типов между примитивами

За исключением boolean, мы можем присвоить примитивное значение другому примитивному типу. Хотя иногда это может привести к потере данных, когда примитив с большим объемом памяти назначается примитиву с меньшим объемом памяти.

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

int counter = 20_000_000;//Assign int to short(data loss)short shortCounter =(short) counter;//assign int to long(no data loss)long longCounter = counter;System.out.println(counter); //20000000System.out.println(shortCounter); //11520System.out.println(longCounter); //20000000

Обратите внимание, что когда Java обнаруживает, что преобразование типа может привести к потере данных(больший тип данных к меньшему), то выдает ошибку несоответствия типов и явно запрашивает приведение типов(например, присваивание 'int' к 'short'). Это помогает обнаруживать и разрешать случайные присваивания с потерей данных.

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

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

Например, java.lang.String — это класс, определенный в библиотеке Java, и вы можете использовать его для манипулирования текстом(последовательностью символов). Вы объявляете ссылочную переменную типа String как:

String str = "Hello World !!";

Что произойдет при выполнении этого кода?

  • Сначала выделяется блок памяти, и имя переменной str связывается с этим местом памяти. Этот процесс аналогичен объявлению переменной примитивного типа данных.
  • Вторая часть кода создает в памяти новый объект String с текстом «Hello World !!» и сохраняет ссылку(или адрес памяти) объекта String в переменной 'str'.

2.2.1 Несколько переменных могут ссылаться на один и тот же объект

Вы также можете присвоить ссылку на объект, хранящийся в одной ссылочной переменной, другой ссылочной переменной. В таких случаях обе ссылочные переменные будут ссылаться на один и тот же объект в памяти.

// Declares String reference variable str1 and str2String str1;String str2;// Assigns the reference of a String object "Hello" to str1str1 = new String( "Hello World !!" );// Assigns the reference stored in str1 to str2str2 = str1;System.out.println( str1 ); //Hello World !!System.out.println( str2 ); //Hello World !!

Существует ссылочная константа(также известная как ссылочный литерал) null, которая может быть назначена любой ссылочной переменной. Если ссылочной переменной назначен null, это означает, что ссылочная переменная не ссылается ни на один объект в памяти.

3. Классы-обертки

Класс-обертка — это класс, объект которого оборачивает или содержит примитивные типы данных. Другими словами, мы можем обернуть примитивное значение в объект класса-обертки.

Обратите внимание, что в Java имеется один класс-оболочка, сопоставленный каждому примитивному типу данных.

Например, класс java.lang.Integer — это объектная версия типа данных int. Аналогично, у нас есть всего 8 классов-оболочек для всех 8 примитивных типов данных.

Имена классов-оболочек такие же, как и у примитивных типов данных, только начинаются с заглавных букв. Эти классы-оболочки — Boolean, Byte, Short, Character, Integer, Long, Float и Double.

4. Автобоксинг

В Java вы можете напрямую присвоить значение примитивного типа классу-оболочке. Например, вы можете присвоить значение int ссылке на класс Integer.

Integer counter = 20;static Float PI = 3.14f;

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

5. Разница между примитивными и непримитивными типами данных

  • Примитивы хранят значения напрямую, которые называются литералами. Ссылочные типы хранят ссылки на реальные объекты в области памяти.
  • Существует 8 фиксированных примитивных типов данных. В Java каждый класс — это тип данных, включающий классы-обертки.

6. Лучшие практики

  • Используйте соглашения об именовании переменных Java и следуйте передовым практикам.
  • Используйте примитивы для переменных, которые являются локальными по области действия, например, внутри методов, счетчиков циклов и промежуточных результатов.
  • При передаче данных между методами или классами лучше использовать объекты, поскольку копироваться будут только их ссылки, и не возникнет дополнительных затрат памяти.
  • При работе с коллекциями(которым требуются объекты) следует использовать объекты.
  • При отправке данных по сети используйте объекты и сделайте их сериализуемыми. Классы-обертки автоматически сериализуемы.
  • Всегда знайте размер типа данных, который вам понадобится. Используйте соответствующие размеры данных. Использование int для хранения булевых значений(0 и 1) — пустая трата памяти.
  • Используйте подчеркивания(выше Java 7) в числах. Это делает их более читабельными.
Прокрутить вверх